2010-11-16 17 views

Odpowiedz

7

Możesz zajrzeć na Boost.Assign, który pozwala na pisanie rzeczy, takich jak:

const std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11); 
+1

Tak, możesz! :) (pokonałeś mnie 5 sekund ...) –

+0

Czy to działa z zestawem? Czy to działa dla różnych typów? –

+0

@Amir: Tak, w obu przypadkach. –

16
int myints[]= {10,20,30,40,50}; 
std::set<int> mySet(myints, myints + 5); 

Ok, wprawdzie dwie linie :)

+0

Przyjemnie, '+ 1' ode mnie. To jest jeszcze łatwiejsze dzięki [te] (http://stackoverflow.com/questions/2552839/which-c-standard-library-wrapper-functions-do-you-use/2553081#2553081). – sbi

+0

@Sbi, dzięki za ten link, bardzo przydatne! –

+1

Jeśli jest dostępna, to wolę '... mySet (myints, myints + _countof (myints)) ...' –

3

Oto C++ 0x alt Odpowiedni do odpowiedzi Moo-Juice na przypadek, w którym budowa A jest droższa niż dla int.

int myints[]= {10,20,30,40,50}; 
size_t total(sizeof(myints)/sizeof(int)); 

auto begin(std::make_move_iterator(myints)); 
auto end(std::make_move_iterator(myints + total)); 

std::set<int> mySet(begin, end); 
+0

+1, to całkiem miłe. –

+0

@ Moo-Juice - tak, ale zainspirowany oryginalną wersją. –

4

W C++ 0x standard definiuje Initializer List jako ulepszenie dla tego rodzaju (niezgrabnego) konstruktu.

Jest dużo łatwiej teraz:

std::set<int> set = {10, 20, 30, 40, 50}; 

Wystarczyło dla biblioteki standardowej zadeklarować następujące konstruktora w zestawie:

template <typename Value, typename Compare, typename Allocator> 
set<Value, Compare, Allocator>::set(std::initializer_list<Value> list); 

i wszystkie nasze obawy były starannie przeciągnął dalej.

+0

Należy zauważyć, że obecnie, w C++ 11, nie trzeba nawet deklarować tego konstruktora. – Claudiu

+0

@Claudiu: Nie bardzo rozumiem, co masz na myśli, obawiam się. –

+0

To znaczy, możesz po prostu zrobić 'std :: set zestaw = {10, 20, 30, 40, 50};' w kodzie bez konieczności dołączania 'szablonu zestaw :: set (std :: initializer_list list); '. [Przykład ideowy tutaj] (https://ideone.com/wlWCMl). – Claudiu

4

Jeśli twoje początkowe dane znajdują się w jakimś pojemniku std::some_container<A> a;, który ma iteratory początkowe i końcowe, i są to kolejne iteratory lub najlepsze (powinny po prostu przeciążać operatora ++), możesz w ten sposób dokonać nowego zestawu.

std::set<A> s(a.begin(), a.end()); 
Powiązane problemy