Есть ли стандартный способ конвертации из контейнерав контейнер? - PullRequest
8 голосов
/ 31 августа 2010

У меня есть два класса A и B, и существует неявный оператор преобразования для перехода от одного к другому, так что:

A a;
B b;
b = a; // Works

Существует ли стандартный способ преобразования std::list<A> в std::list<B>? (Или даже от std::vector<A> до std::list<B>).

Я знаю, что могу пройтись по списку и построить второй элемент списка за элементом, но мне интересно, есть ли более элегантное решение.

К сожалению Я не могу использовать boost, но из любопытства в качестве дополнительного вопроса, если повышение может справиться с этим, я был бы рад узнать как.

1 Ответ

15 голосов
/ 31 августа 2010

Ну да.Каждый тип контейнера последовательности имеет конструктор шаблона, который принимает пару итераторов (диапазон итераторов) в качестве входных данных.Его можно использовать для построения одной последовательности из другой, независимо от типов последовательности, если типы элементов последовательности могут быть преобразованы друг в друга.Как, например,

std::vector<A> v;
...
std::list<B> l(v.begin(), v.end());

Также контейнеры последовательности имеют функцию-член assign, которая делает то же самое с семантикой присваивания (в отличие от семантики инициализации).

std::vector<A> v;
std::list<B> l;
...
l.assign(v.begin(), v.end()); // replaces the contents of `l`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...