2012-01-26 63 views
5

Tôi muốn khởi tạo một vectơ sử dụng một mảng std::string s.Khởi tạo một vectơ std :: string với một mảng

Tôi có giải pháp sau đây, nhưng tự hỏi liệu có cách nào thanh lịch hơn để thực hiện việc này không?

std::string str[] = { "one", "two", "three", "four" }; 
vector<std::string> vec; 
vec = vector<std::string>(str, str + (sizeof (str)/sizeof (std::string))); 

tôi có thể, tất nhiên, làm cho điều này dễ đọc hơn bằng cách xác định kích thước như sau:

int size = (sizeof (str)/sizeof (std::string)); 

và thay thế khởi vector với:

vec = vector<std::string>(str, str + size); 

Nhưng điều này vẫn cảm thấy một ít "không thích hợp".

+0

Xem http://stackoverflow.com/questions/231491/how-to-initialize-const-stdvectort-like-ac-array –

Trả lời

4

Vâng bước trung gian là không cần thiết:

std::string str[] = { "one", "two", "three", "four" }; 
vector<std::string> vec(str, str + (sizeof (str)/sizeof (std::string))); 

Trong C++ 11 bạn muốn có thể đặt khởi cú đúp ở các nhà xây dựng bằng cách sử dụng constructor danh sách initializer.

+0

Cảm ơn, tôi không chắc liệu tôi đã hoàn toàn bỏ lỡ bất kỳ khác phương pháp tiềm năng của việc khởi tạo mọi thứ. –

3

Trong C++ 11, chúng tôi có std::beginstd::end, mà làm việc cho cả container STL-phong cách và xây dựng trong các mảng:

#include <iterator> 

std::vector<std::string> vec(std::begin(str), std::end(str)); 

mặc dù, như đã đề cập trong các ý kiến, bạn thường sẽ không cần mảng trung gian ở tất cả:

std::vector<std::string> vec {"one", "two", "three", "four"}; 

trong C++ 03, bạn có thể sử dụng một mẫu để suy ra kích thước của mảng, hoặc là để thực hiện riêng beginend, hoặc để khởi mảng trực tiếp của bạn:

template <typename T, size_t N> 
std::vector<T> make_vector(T &(array)[N]) { 
    return std::vector<T>(array, array+N); 
} 

std::vector<std::string> vec = make_vector(str); 
+2

Trong C++ 11, chúng ta có các initialisers thích hợp, không cần cho phương thức đầu tiên của bạn. –

+0

@KonradRudolph: điểm tốt (mặc dù câu hỏi đặc biệt yêu cầu về khởi tạo từ một mảng, vì vậy tôi sẽ để lại phương pháp đó trong câu trả lời). –

+2

Dài trước C++ 11, chúng tôi đã có 'bắt đầu' và' cuối' trong bộ công cụ cá nhân của chúng tôi. Và chúng hầu như có liên quan đến pre-C++ 11. –

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