преобразовать список STL <string>в вектор <string>c ++ 11 - PullRequest
0 голосов
/ 27 июня 2018

Как лучше всего преобразовать список в вектор?

Я думал о петле. Но может быть, есть лучший способ в C ++ 11?

#include <list>
#include <string>
#include <vector>
using namespace std;

list<string> list_string {
  "one",
  "two",
  "three"
};

vector<string> vector_string;
for (auto item : list_string) {
    vector_string.push_back(item);
}

В C # я мог бы просто инициализировать другой тип данных, используя конструктор, принимающий интерфейс IEnumerable. Было любопытно, поддерживает ли C ++ 11 что-нибудь подобное ...

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Вы можете использовать std::copy для копирования элементов в ваш вектор:

vector<string> vector_string(list_string.size());
copy(begin(list_string), end(list_string), begin(vector_string));
0 голосов
/ 27 июня 2018

«Конвертировать» немного двусмысленно. Сначала подумайте о копировании. Поскольку list::size() - это O (1) в C ++ 11, достаточно эффективный способ скопировать list<string> в vector<string>:

vector<string> vector_string;
vector_string.reserve(list_string.size());
vector_string.assign(list_string.begin(), list_string.end());

Если вам больше не нужен list_string, вы можете повысить эффективность (при условии достаточно больших строк, требующих выделения кучи), используя std::move_iterator, например:

vector<string> vector_string;
vector_string.reserve(list_string.size());
vector_string.assign(move_iterator(list_string.begin()), move_iterator(list_string.end()));

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

0 голосов
/ 27 июня 2018

Один из конструкторов для std::vector (и действительно, для любого из стандартных контейнеров) принимает пару итераторов:

template< class InputIt >
vector( InputIt first, InputIt last, 
        const Allocator& alloc = Allocator() );

Так что вы можете просто сделать:

vector<string> v(list_string.begin(), list_string.end());
...