Attualmente Sto creando un nuovo set come questo:C'è un modo rapido per creare un set?
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
C'è un modo per creare s
in una linea?
Attualmente Sto creando un nuovo set come questo:C'è un modo rapido per creare un set?
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
C'è un modo per creare s
in una linea?
È possibile guardare in Boost.Assign, che permette di scrivere cose come:
const std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11);
Si potrebbe voler dare un'occhiata a Boost.Assign:
http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html
questo è un buon uso dell'operatore virgola sovraccarico: +1 – Chubsdad
int myints[]= {10,20,30,40,50};
std::set<int> mySet(myints, myints + 5);
Ok, ovviamente due righe :)
Nice, '+ 1' da me. Questo è ancora più facile con [questi] (http://stackoverflow.com/questions/2552839/which-c-standard-library-wrapper-functions-do-you-use/2553081#2553081). – sbi
@Sbi, grazie per il collegamento, molto utile! –
Se è disponibile, allora preferisco '... mySet (myints, myints + _countof (myint)) ...' –
Ecco un C++ 0x alt ernativo alla risposta di Moo-Juice per il caso in cui la costruzione di A è più costosa rispetto a 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, è molto carino. –
@ Moo-Juice - sì, ma ispirato alla tua versione originale. –
In C++ 0x standard definisce la Initializer List come un miglioramento per questo tipo di costrutto (scomodo).
E 'molto più semplice:
std::set<int> set = {10, 20, 30, 40, 50};
Tutto è bastata per la libreria standard di dichiarare il seguente costruttore per il set:
template <typename Value, typename Compare, typename Allocator>
set<Value, Compare, Allocator>::set(std::initializer_list<Value> list);
e tutte le nostre preoccupazioni erano ordinatamente strisciato via.
Nota che al giorno d'oggi, con C++ 11, non hai nemmeno bisogno di dichiararlo. – Claudiu
@ Claudiu: Non capisco cosa intendi, temo. –
Voglio dire che puoi semplicemente fare 'std :: set
Se i dati iniziali sono in un contenitore std::some_container<A> a;
che ha inizio e fine iteratori e questo è avanti iteratori o migliori (dovrebbero solo essere sovraccaricati con operatore ++), è possibile creare questo nuovo set in questo modo.
std::set<A> s(a.begin(), a.end());
Sì, è possibile! :) (Mi hai battuto per 5 secondi ...) –
Funziona con il set? Funziona per diversi tipi? –
@Amir: Sì, su entrambi i fronti. –