Mogę utworzyć tablicę i zainicjować ją w następujący sposób:
int a[] = {10, 20, 30};
Jak utworzyć std::vector
i zainicjować go podobnie elegancko?
Najlepszy sposób, jaki znam to:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Czy jest lepszy sposób?
c++
vector
stl
initialization
Agnel Kurian
źródło
źródło
tr1::array
jest użyteczny, ponieważ zwykłe tablice nie zapewniają interfejsu kontenerów STLOdpowiedzi:
Jedną z metod byłoby użycie tablicy do zainicjowania wektora
źródło
static
lubconst
, jednak oboje uczynić go bardziej wyraźne, jak należy go stosować i pozwól kompilator podjąć dodatkowe optymalizacje.Jeśli Twój kompilator obsługuje C ++ 11, możesz po prostu:
Jest to dostępne w GCC od wersji 4.4 . Niestety VC ++ 2010 wydaje się pozostawać w tyle pod tym względem.
Alternatywnie biblioteka Boost.Assign wykorzystuje magię inną niż makr, aby umożliwić:
Lub:
Należy jednak pamiętać, że wiąże się to z pewnym nakładem (w zasadzie
list_of
konstruuje sięstd::deque
pod maską), więc w przypadku kodu o kluczowej wydajności lepiej byłoby robić tak, jak mówi Yacoby.źródło
this->vect = {};
:?std::vector<T> vector;
std::vector<int> v = {1, 2, 3, 4};
, wektorinitializer list constructor
zostanie wezwany do tego rodzaju inicjalizacji, jego dokumentację można znaleźć wC++ 11
sekcji .Jeśli możesz, użyj nowoczesnego sposobu C ++ [11,14,17, ...]:
Stary sposób zapętlania lub używania tablicy o zmiennej długości
sizeof()
jest naprawdę okropny dla oczu i całkowicie niepotrzebny z punktu widzenia obciążenia umysłowego. Fujźródło
W C ++ 0x będziesz mógł to zrobić w taki sam sposób jak w przypadku tablicy, ale nie w obecnym standardzie.
Tylko z obsługą języka możesz użyć:
Jeśli możesz dodać inne biblioteki, możesz spróbować boost :: assignment:
Aby uniknąć zakodowania na stałe rozmiaru tablicy:
źródło
int another[size_of_array(array)]
podczas gdy możeszint another[ARRAY_SIZE(array)]
.sizeof
wyrażenie, które nie wymaga definicji. Chociaż faktycznie możesz podać definicję, wykonanie jej poprawnie wymagałoby statycznego przydzielenia tablicy i zwrócenia do niej odwołania, a następnym pytaniem byłoby, co byłoby sensowne jako wartości dla tablicy? (Zauważ też, że oznacza to jedną tablicę dla kombinacji typu / rozmiaru instancji funkcji!) Ponieważ nie jest to rozsądne zastosowanie, wolałbym go unikać.W C ++ 11:
Korzystanie z listy ulepszeń:
Za pomocą boost przypisania:
Konwencjonalny STL:
Konwencjonalny STL z ogólnymi makrami:
Konwencjonalny STL z makrem inicjatora wektora:
źródło
std::begin
istd::end
na matrycy, a więc wektor może być również inicjowane podobnestatic const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));
.Pomyślałem, że wrzucę moje 0,02 $. Oświadczam, że:
gdzieś w nagłówku narzędzia, a następnie wszystko, co jest wymagane, to:
Ale nie mogę się doczekać C ++ 0x. Utknąłem, ponieważ mój kod musi się również kompilować w programie Visual Studio. Gwizd.
źródło
const T (&data)[N]
część? Jak oblicza się rozmiar tablicy w twoim połączeniumakeVector(values)
?Przed C ++ 11:
Metoda 1 =>
Metoda 2 =>
C ++ 11 i nowsze wersje są również możliwe
źródło
Począwszy od:
Jeśli nie masz kompilatora C ++ 11 i nie chcesz używać boost:
Jeśli nie masz kompilatora C ++ 11 i możesz użyć boost:
Jeśli masz kompilator C ++ 11:
źródło
Do inicjalizacji wektorów -
można to zrobić, jeśli masz kompilator c ++ 11.
W przeciwnym razie możesz mieć tablicę danych, a następnie użyć pętli for.
Oprócz nich istnieją różne inne sposoby opisane powyżej przy użyciu kodu. Moim zdaniem te sposoby są łatwe do zapamiętania i szybkie do napisania.
źródło
Najłatwiej to zrobić:
źródło
Buduję własne rozwiązanie za pomocą
va_arg
. To rozwiązanie jest zgodne z C ++ 98.Próbny
źródło
Jeśli Twój kompilator obsługuje makra Variadic (co jest prawdą w przypadku większości współczesnych kompilatorów), możesz użyć następującego makra, aby zmienić inicjalizację wektorową w jednowierszową:
Za pomocą tego makra możesz zdefiniować zainicjowany wektor za pomocą kodu w następujący sposób:
Spowoduje to utworzenie nowego wektora int o nazwie my_vector z elementami 1, 2, 3, 4.
źródło
Jeśli nie chcesz używać wzmocnienia, ale chcesz cieszyć się podobną składnią
po prostu dołącz ten fragment kodu
źródło
((((v+=1),2),3),4),5)
Oto jak to działa: Najpierwvector<T> += T
zwraca vector_inserter pozwala wywołać go,vi
który otacza oryginalny wektor, a następnievi,T
dodać T do oryginalnego wektora, któryvi
otacza i zwróć go, abyśmy mogli zrobić tovi,T
ponownie.W C ++ 11:
źródło
vector<int> arr = {10, 20, 30};
.możesz to zrobić za pomocą boost :: przypisać.
szczegóły tutaj
źródło
+=
on 1,2,3,4 .. na końcu wartości, czy dodaje 1 do 1. elementu, 2 do 2. elementu, 3 do 3. elementu (tak jak w składni takiej jak ta w MATLAB- jak języki)Nowsza duplikat pytanie ma tę odpowiedź przez Wiktora Sehr . Dla mnie jest kompaktowy, atrakcyjny wizualnie (wygląda na to, że „wpychasz” wartości), nie wymaga c ++ 11 ani modułu innej firmy i unika używania dodatkowej (zapisanej) zmiennej. Poniżej opisuję, jak go używam z kilkoma zmianami. Mogę przejść do rozszerzenia funkcji wektora i / lub va_arg w przyszłym intead.
źródło
Poniższych metod można użyć do zainicjowania wektora w c ++.
int arr[] = {1, 3, 5, 6}; vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
vector<int>v; v.push_back(1); v.push_back(2); v.push_back(3);
i tak dalejvector<int>v = {1, 3, 5, 7};
Trzeci jest dozwolony tylko w C ++ 11 i późniejszych.
źródło
Jest tu wiele dobrych odpowiedzi, ale ponieważ niezależnie doszedłem do siebie przed przeczytaniem tego, pomyślałem, że i tak podrzucę tu mój ...
Oto metoda, której używam do tego, która będzie działać uniwersalnie na kompilatorach i platformach:
Utwórz struct lub klasę jako kontener dla swojej kolekcji obiektów. Zdefiniuj funkcję przeciążenia operatora dla <<.
Możesz tworzyć funkcje, które przyjmują strukturę jako parametr, np .:
Następnie możesz wywołać tę funkcję w następujący sposób:
W ten sposób możesz budować i przekazywać dynamicznie wielkościowy zbiór obiektów do funkcji w jednym czystym wierszu!
źródło
Jeśli chcesz mieć coś w tej samej ogólnej kolejności co Boost :: przypisanie bez tworzenia zależności od Boost, poniższe są co najmniej niejasno podobne:
Chociaż chciałbym, aby składnia za jego użycie była czystsza, nadal nie jest szczególnie okropna:
źródło
Do kompilacji użyj:
źródło
źródło
Jeśli tablica to:
źródło
Wygodnie jest utworzyć wektor wstawiany bez definiowania zmiennej podczas pisania testu, na przykład:
źródło
Powiązane, możesz użyć następujących, jeśli chcesz, aby wektor był całkowicie gotowy do użycia w szybkiej instrukcji (np. Natychmiastowe przejście do innej funkcji):
przykładowa funkcja
przykładowe użycie
choć uważaj na rodzaj, upewnij się, że pierwsza wartość jest dokładnie taka, jak chcesz.
źródło
Istnieje wiele sposobów na zakodowanie wektora, podzielę się kilkoma sposobami:
źródło
„Jak utworzyć wektor STL i zainicjować go w powyższy sposób? Jak najlepiej to zrobić przy minimalnym wysiłku pisania?”
Najprostszym sposobem na zainicjowanie wektora po zainicjowaniu wbudowanej tablicy jest użycie listy inicjalizacyjnej, która została wprowadzona w C ++ 11 .
ivec ma rozmiar 3 elementów po wykonaniu Przypisanie (instrukcja z etykietą).
źródło
B. Stroustrup opisuje dobry sposób łączenia operacji w 16.2.10 Odniesienie do siebie na stronie 464 w edycji C ++ 11 programu Prog. Lang. gdzie funkcja zwraca odwołanie, tutaj zmodyfikowane do wektora. W ten sposób możesz łączyć łańcuchy,
v.pb(1).pb(2).pb(3);
ale może to być zbyt wiele pracy dla tak małych zysków.źródło
Najprostszy, bardziej ergonomiczny sposób (z C ++ 11 lub nowszym):
źródło
Jeśli chcesz mieć to we własnej klasie:
źródło