2012-01-18 72 views
167

Possible Duplicate:
C++: Easiest way to initialize an STL vector with hardcoded elementsCách khởi tạo vectơ trong C++

Tôi muốn khởi tạo vectơ giống như trong trường hợp mảng.

Ví dụ

int vv[2] = {12, 43}; 

Nhưng khi tôi làm điều đó như thế này,

vector<int> v(2) = {34, 23}; 

HOẶC

vector<int> v(2); 
v = {0, 9}; 

nó mang lại một lỗi:

expected primary-expression before ‘{’ token

AND

error: expected ‘,’ or ‘;’ before ‘=’ token

tương ứng.

+3

Ngoài ra còn có [how-to khởi 'std :: vector const ' như mảng ac] (http://stackoverflow.com/questions/231491/how- để khởi tạo-const-stdvectort-like-ac-array/254143). – Shadow2531

+0

Bạn nên bật hỗ trợ C++ 11 trong trình biên dịch của mình, ví dụ: 'g ++ -std = C++ 11 your_file.cc'. Sau đó, bạn có thể sử dụng hàm tạo danh sách khởi tạo của luồng (mục cuối cùng trong [tham chiếu này] (http://en.cppreference.com/w/cpp/container/vector/vector)) –

+1

Không phải là một sự lừa đảo - câu hỏi khác là làm thế nào để làm điều đó với cũ c + +, câu trả lời của WTF là làm thế nào để làm điều đó bây giờ –

Trả lời

234

Với sự mới chuẩn C++ (có thể cần cờ đặc biệt để được kích hoạt trên trình biên dịch của bạn), bạn chỉ đơn giản có thể làm:

std::vector<int> v { 34,23 }; 
// or 
// std::vector<int> v = { 34,23 }; 

Hoặc thậm chí:

std::vector<int> v(2); 
v = { 34,23 }; 

Mở trình biên dịch không hỗ trợ tính năng này (danh sách trình khởi tạo) nhưng bạn có thể mô phỏng điều này bằng một mảng:

int vv[2] = { 12,43 }; 
std::vector<int> v(&vv[0], &vv[0]+2); 

Hoặc, đối với trường hợp giao cho một vector hiện:

int vv[2] = { 12,43 }; 
v.assign(&vv[0], &vv[0]+2); 

Giống như James Kanze đề nghị, đó là mạnh mẽ hơn để có chức năng cung cấp cho bạn sự khởi đầu và kết thúc của một mảng:

template <typename T, size_t N> 
T* begin(T(&arr)[N]) { return &arr[0]; } 
template <typename T, size_t N> 
T* end(T(&arr)[N]) { return &arr[0]+N; } 

Và sau đó bạn có thể làm điều này mà không cần phải để lặp lại kích thước trên tất cả:

int vv[] = { 12,43 }; 
std::vector<int> v(begin(vv), end(vv)); 
+15

Hoặc chỉ đơn giản là: std :: vector v (vv, vv + 2); –

+8

Hoặc mạnh mẽ hơn: 'std :: vector v (bắt đầu (w), kết thúc (w);'. 'Bắt đầu' và' cuối' là tiêu chuẩn trong C++ 11 (nhưng sau đó bạn không cần chúng) –

+1

Tôi biết đây là một câu hỏi cũ, nhưng chính xác bạn đang làm gì ở đây: 'std :: vector v (& vv [0], & vv [0] +2);'?Những gì tôi thấy là, bạn đang xây dựng một vectơ có chỗ cho các giá trị '& vv [0]' (sẽ là một địa chỉ bộ nhớ), và lấp đầy từng khoảng trống trong vectơ bằng '& vv [0] + 2' ... sẽ sử dụng hàm tạo 2 trên trang này: http://en.cppreference.com/w/cpp/container/vector/vector mà không cung cấp đối số thứ ba, mặc định là Allocator(). Tôi biết tôi đang thiếu một cái gì đó. –

27

Bạn cũng có thể làm như thế này:

template <typename T> 
class make_vector { 
public: 
    typedef make_vector<T> my_type; 
    my_type& operator<< (const T& val) { 
    data_.push_back(val); 
    return *this; 
    } 
    operator std::vector<T>() const { 
    return data_; 
    } 
private: 
    std::vector<T> data_; 
}; 

Và sử dụng nó như thế này:

std::vector<int> v = make_vector<int>() << 1 << 2 << 3; 
+0

Có thể di chuyển * data_ * sang * v * thay vì gọi hàm tạo bản sao không? – Per

+1

Xin chào! Tôi cho rằng bạn làm như thế này (cảnh báo, chưa được kiểm tra): toán tử std :: vector &&() { return std :: move (data_); } –

Các vấn đề liên quan