2010-08-31 8 views
8

mam dwie klasy A i B i istnieje niejawna konwersja operatora, aby przejść z jednego do drugiego, tak że:Czy istnieje standardowy sposób konwersji z kontenera <Type1> na kontener <Type2>?

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

Czy istnieje standardowy sposób przekonwertować std::list<A> do std::list<B>? (Lub nawet od std::vector<A> do std::list<B>).

Wiem, że mogę iterować koryto do listy i budować drugi element listy według pozycji, ale zastanawiam się, czy istnieje bardziej eleganckie rozwiązanie.

Niestety Nie mogę korzystać boost ale z ciekawości jako pytanie premiowej, jeśli impuls może obsłużyć tego, byłbym szczęśliwy, aby wiedzieć, jak też.

+0

Myślę, że to musiało zostać zadane wcześniej, ale nie mogłem go znaleźć. – ereOn

Odpowiedz

15

Cóż, tak. Każdy typ kontenera sekwencji ma konstruktor szablonu, który pobiera parę iteratorów (zakres iteratorów) jako dane wejściowe. Można go użyć do skonstruowania jednej sekwencji z drugiej, niezależnie od typów sekwencji, o ile typy elementów sekwencji są ze sobą wymienialne. Jak na przykład

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

także pojemniki sekwencji mają assign funkcję członu który wykonuje to samo z semantyki przydziału (w przeciwieństwie do inicjalizacji semantykę).

std::vector<A> v; 
std::list<B> l; 
... 
l.assign(v.begin(), v.end()); // replaces the contents of `l` 
+0

Nie mogę uwierzyć, że to było takie proste. I nie mogę uwierzyć, że o tym nie pomyślałem. Wielkie dzięki;) – ereOn

+0

jeśli typ A nie jest wymienny na typ B, jakie powinno być zachowanie? – bjskishore123

+0

w zależności od tego, co robisz i kto jest właścicielem listy, std :: copy może być wart obejrzenia, prawdopodobnie z iteratorem wprowadzającym –

Powiązane problemy