Obecnie tworzę nowy zestaw jak poniżej:Czy istnieje szybki sposób na utworzenie zestawu?
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
Czy istnieje sposób, aby utworzyć s
w jednej linii?
Obecnie tworzę nowy zestaw jak poniżej:Czy istnieje szybki sposób na utworzenie zestawu?
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
Czy istnieje sposób, aby utworzyć s
w jednej linii?
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);
Czasami warto spojrzeć na Boost.Assign:
http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html
to miłe użycie przeciążonego operatora przecinka: +1 – Chubsdad
int myints[]= {10,20,30,40,50};
std::set<int> mySet(myints, myints + 5);
Ok, wprawdzie dwie linie :)
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
@Sbi, dzięki za ten link, bardzo przydatne! –
Jeśli jest dostępna, to wolę '... mySet (myints, myints + _countof (myints)) ...' –
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);
+1, to całkiem miłe. –
@ Moo-Juice - tak, ale zainspirowany oryginalną wersją. –
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.
Należy zauważyć, że obecnie, w C++ 11, nie trzeba nawet deklarować tego konstruktora. – Claudiu
@Claudiu: Nie bardzo rozumiem, co masz na myśli, obawiam się. –
To znaczy, możesz po prostu zrobić 'std :: set
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());
Tak, możesz! :) (pokonałeś mnie 5 sekund ...) –
Czy to działa z zestawem? Czy to działa dla różnych typów? –
@Amir: Tak, w obu przypadkach. –