Инициализация вектора std :: string с массивом - PullRequest
5 голосов
/ 26 января 2012

Я хочу инициализировать вектор с использованием массива std::string с.

У меня есть следующее решение, но мне интересно, есть ли более элегантный способ сделать это?

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

Конечно, я мог бы сделать это более читабельным, определив размер следующим образом:

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

и заменив векторную инициализацию на:

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

Но это все еще немного "безвкусный».

Ответы [ 2 ]

4 голосов
/ 26 января 2012

Ну, промежуточный шаг не нужен:

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

В C ++ 11 вы можете поместить фигурную инициализацию в конструктор, используя конструктор списка инициализаторов.

3 голосов
/ 26 января 2012

В C ++ 11 у нас есть std::begin и std::end, которые работают как для контейнеров в стиле STL, так и для встроенных массивов:

#include <iterator>

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

, хотя, как упоминалось в комментариях,Обычно вам вообще не нужен промежуточный массив:

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

В C ++ 03 вы можете использовать шаблон для определения размера массива, либо для реализации собственных begin и end, или для инициализации массива напрямую:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...