Я могу создать массив и инициализировать его так:
int a[] = {10, 20, 30};
Как мне создать std::vector
и инициализировать его так же элегантно?
Лучший способ, который я знаю, это:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Есть ли способ лучше?
c++
vector
stl
initialization
Агнель Курьян
источник
источник
tr1::array
полезно, потому что обычные массивы не предоставляют интерфейс контейнеров STLОтветы:
Одним из методов будет использование массива для инициализации вектора
источник
static
илиconst
, однако они оба делают его более понятным относительно того, как его следует использовать, и позволяют компилятору вносить дополнительные оптимизации.Если ваш компилятор поддерживает C ++ 11, вы можете просто сделать:
Это доступно в GCC начиная с версии 4.4 . К сожалению, VC ++ 2010 в этом отношении, похоже, отстает.
В качестве альтернативы библиотека Boost.Assign использует немакро -магию, чтобы разрешить следующее:
Или:
Но имейте в виду , что это имеет некоторые накладные расходы ( в основном,
list_of
строитstd::deque
под капотом) , поэтому для повышения производительности критически важных код , который вы бы лучше делать , как говорит Yacoby.источник
this->vect = {};
?std::vector<T> vector;
std::vector<int> v = {1, 2, 3, 4};
, векторinitializer list constructor
будет вызван для такого рода инициализации, его документ можно найти вC++ 11
разделе .Если вы можете, используйте современный C ++ [11,14,17, ...] способ:
Старый способ циклического перебора массива переменной длины или использование
sizeof()
действительно ужасен для глаз и совершенно не нужен с точки зрения умственных издержек. Тьфу.источник
В C ++ 0x вы сможете сделать это так же, как с массивом, но не в текущем стандарте.
Только с языковой поддержкой вы можете использовать:
Если вы можете добавить другие библиотеки, вы можете попробовать boost :: assignment:
Чтобы избежать жесткого кодирования размера массива:
источник
int another[size_of_array(array)]
, тогда как вы можете делатьint another[ARRAY_SIZE(array)]
.sizeof
выражения, которое не нуждается в определении. Хотя вы действительно можете предоставить определение, чтобы сделать его правильно, потребуется статическое размещение массива и возвращение ссылки на него, и следующий вопрос будет состоять в том, что будет иметь смысл в качестве значений для массива? (Также обратите внимание, что это означает один массив на комбинацию типа / размера экземпляров функции!) Поскольку для него нет разумного использования, я бы предпочел этого избегать.В C ++ 11:
Использование boost list_of:
Используя boost назначить:
Обычный STL:
Обычный STL с общими макросами:
Обычный STL с макросом инициализатора вектора:
источник
std::begin
иstd::end
для массива, поэтому вектор также можно инициализировать какstatic const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));
.Просто подумал, что я добавлю свои 0,02 доллара. Я склонен заявлять об этом:
в служебном заголовке где-то, и тогда все, что требуется, это:
Но я не могу ждать C ++ 0x. Я застрял, потому что мой код также должен компилироваться в Visual Studio. Бу.
источник
const T (&data)[N]
часть? Как определяется размер массива в вашем вызовеmakeVector(values)
?До C ++ 11:
Метод 1 =>
Способ 2 =>
C ++ 11 и ниже также возможно
источник
Начиная с:
Если у вас нет компилятора C ++ 11 и вы не хотите использовать boost:
Если у вас нет компилятора C ++ 11 и вы можете использовать boost:
Если у вас есть компилятор C ++ 11:
источник
Для векторной инициализации -
может быть сделано, если у вас есть компилятор c ++ 11.
Иначе, вы можете иметь массив данных, а затем использовать цикл for.
Помимо этого, есть несколько других способов, описанных выше, с использованием некоторого кода. На мой взгляд, эти способы легко запомнить и быстро написать.
источник
Самый простой способ сделать это:
источник
Я строю свое собственное решение, используя
va_arg
. Это решение совместимо с C ++ 98.демонстрация
источник
Если ваш компилятор поддерживает макросы Variadic (что справедливо для большинства современных компиляторов), то вы можете использовать следующий макрос, чтобы превратить инициализацию вектора в однострочник:
С помощью этого макроса вы можете определить инициализированный вектор с помощью следующего кода:
Это создаст новый вектор целых с именем my_vector с элементами 1, 2, 3, 4.
источник
Если вы не хотите использовать boost, но хотите насладиться синтаксисом вроде
просто включите этот кусок кода
источник
((((v+=1),2),3),4),5)
вот как это работает: во-первых,vector<T> += T
возвращает vector_inserter, который позволяет вызывать его,vi
который инкапсулирует исходный вектор, затемvi,T
добавляет T к исходному вектору, которыйvi
инкапсулирует и возвращает его самостоятельно, чтобы мы могли сделать этоvi,T
снова.В C ++ 11:
источник
vector<int> arr = {10, 20, 30};
.Вы можете сделать это используя boost :: assign.
подробно здесь
источник
+=
1,2,3,4 .. к концу значений или добавляет 1 к 1-му элементу, 2 к 2-му элементу, 3 к 3-му элементу (такой синтаксис должен быть в MATLAB- как языки)Более поздняя копия вопрос имеет этот ответ на Викторе SEHR . Для меня это компактно, визуально привлекательно (похоже, что вы «запихиваете» значения в), не требует c ++ 11 или стороннего модуля и избегает использования дополнительной (записанной) переменной. Ниже, как я использую это с несколькими изменениями. Я могу перейти к расширению функции vector и / или va_arg в будущем intead.
источник
Ниже методы могут быть использованы для инициализации вектора в 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);
и так далееvector<int>v = {1, 3, 5, 7};
Третий разрешен только в C ++ 11 и далее.
источник
Здесь есть много хороших ответов, но так как я самостоятельно дошел до того, как прочел это, я решил все равно бросить здесь ...
Вот метод, который я использую для этого, который будет работать универсально на всех компиляторах и платформах:
Создайте структуру или класс в качестве контейнера для вашей коллекции объектов. Определить функцию перегрузки оператора для <<.
Вы можете создавать функции, которые принимают вашу структуру в качестве параметра, например:
Затем вы можете вызвать эту функцию, например так:
Таким образом, вы можете построить и передать динамически измеренную коллекцию объектов в функцию в одну чистую строку!
источник
Если вы хотите что-то в том же общем порядке, что и Boost :: assign, не создавая зависимости от Boost, следующее, по крайней мере, примерно похоже:
Хотелось бы, чтобы синтаксис его использования был чище, он все же не особо ужасен:
источник
Для компиляции используйте:
источник
источник
Если массив:
источник
При написании теста очень удобно создать встроенный вектор без определения переменной, например:
источник
В связи с этим вы можете использовать следующее, если хотите, чтобы вектор был полностью готов к быстрому выражению (например, к немедленной передаче в другую функцию):
пример функции
пример использования
хотя будьте осторожны с типом decl, убедитесь, что первое значение точно соответствует желаемому.
источник
Есть несколько способов жестко закодировать вектор, я поделюсь несколькими способами:
источник
«Как мне создать вектор STL и инициализировать его, как указано выше? Каков наилучший способ сделать это с минимальными усилиями при печати?»
Самый простой способ инициализировать вектор при инициализации встроенного массива - использовать список инициализаторов, который был представлен в C ++ 11 .
ivec имеет размер 3 элемента после выполнения Assigning (помеченный оператор).
источник
Б. Страуструп описывает хороший способ цепочки операций в 16.2.10 Selfreference на стр. 464 в Prog версии C ++ 11. Lang. где функция возвращает ссылку, здесь измененную на вектор. Таким образом, вы можете цепляться как,
v.pb(1).pb(2).pb(3);
но может быть слишком много работы для такой маленькой выгоды.источник
Самый простой, более эргономичный способ (с C ++ 11 или новее):
источник
Если вы хотите иметь его в своем классе:
источник