Инициализировать vector в C++
В этом посте мы обсудим, как инициализировать vector в C++.
Есть несколько способов инициализировать vector в C++, как показано ниже:
1. Использование списка инициализаторов
В C++11 и выше мы можем использовать списки инициализаторов ‘<. >‘ для инициализации вектора. Это не будет работать в C++98, так как стандарт позволяет инициализировать vector конструктором, а не ‘<. >‘ .
std :: vector < int >vec < 1 , 2 , 3 , 4 , 5 >;
for ( int i : vec ) <
std :: cout << i << ' ' ;
результат:
1 2 3 4 5
2. Использование конструктора копирования
Мы можем использовать конструктор копирования для инициализации вектора из других элементов вектора, следуя тому же порядку элементов.
std :: vector < int >v = < 1 , 2 , 3 , 4 , 5 >;
// конструктор копирования
std :: vector < int >vec ( v ) ;
for ( int i : vec ) <
std :: cout << i << ' ' ;
результат:
1 2 3 4 5
3. Использование конструктора диапазонов
Мы можем использовать конструктор диапазона для инициализации векторов из элементов массива или другого контейнера.
std :: vector < int >vec ( std :: begin ( arr ) , std :: end ( arr ) ) ;
// или инициализировать так
// std::vector
for ( int i : vec ) <
std :: cout << i << ' ' ;
результат:
1 2 3 4 5
4. Использование конструктора заливки
Мы можем использовать заполнить конструктор для инициализации вектора указанного размера указанным элементом.
int val = 1 ;
unsigned int n = 5 ;
// заполнение конструктора
std :: vector < int >vec ( n , val ) ;
for ( int i : vec ) <
std :: cout << i << ' ' ;
результат:
1 1 1 1 1
5. Использование конструктора по умолчанию
Наконец, мы можем использовать конструктор пустого контейнера (или конструктор по умолчанию) чтобы построить пустой vector (без элементов), как показано ниже:
std :: vector < int >vec ;
for ( int i : vec ) <
std :: cout << i << ' ' ;
Это все, что касается инициализации вектора в C++.
Оценить этот пост
Средний рейтинг 3.67 /5. Подсчет голосов: 6
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Подписывайся
0 Комментарии
Встроенные отзывы
Просмотреть все комментарии
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации
- Все проблемы
- Практика DSA
- 100 самых популярных задач
- 50 лучших классических задач
- Лучшие алгоритмы
- Компилятор С/С++
- Компилятор Java
- Компилятор Python
- Компилятор JavaScript
- компилятор PHP
- Компилятор C#
- Свяжитесь с нами
- Политика конфиденциальности
- условия обслуживания
- Подпишитесь на новые публикации
Techie Delight © 2023 Все права защищены.
Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно
Инициализировать вектор с помощью строки C++ [дубликат]
Необходимо инициализировать вектор с помощью пользовательского ввода. К примеру пользователь вводит 1 2 3 5 104 1034 , в векторе должны содержаться элементы которые ввел пользователь. Можно ли как нибудь это сделать без использования регулярных выражений?
Отслеживать
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
задан 7 мар 2016 в 19:03
143 1 1 серебряный знак 9 9 бронзовых знаков
Пользователь вводит все в одну строку
7 мар 2016 в 19:06
Предположим у нас есть строка string x=»1 10 2 1023 500″; Необходимо из нее сделать вектор, не важно в каком формате будут храниться данные в векторе(числах или строках). Необходимо просто распарсить эту строку и ею инициализировать массив.Так вроде проще объяснил. Но желательно, что бы сразу со ввода пользовательского инициализация шла.
7 мар 2016 в 19:29
Сразу парсить ввод (из cin ) — можно брать мое решение (и тогда плевать даже, в скольки строках будет ввод), из строки x — через stringstream . Кстати, можно как у Abyx, просто используя istream_iterator
7 мар 2016 в 19:38
Возможный дубликат ru.stackoverflow.com/q/498094/176217
8 мар 2016 в 11:06
@MNikita, если вам был дан исчерпывающи ответ, то отметьте его верным (галка напротив выбранного ответа)
10 мар 2016 в 23:02
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Пожалуй, простейший способ — если вводятся только те же целые числа, то просто вводить их в цикле:
vector v; int n; while(cin >> n) v.push_back(n);
Как только будет прочтено НЕ целое число, cin перейдет в состояние fail (из-за неверного формата ожидаемого числа) и ввод прекратится. Останется обработать этот нечисленный ввод. Никаких регулярных выражений.
Если это не совсем то, что надо — поясните ваш вопрос подробнее.
Отслеживать
ответ дан 7 мар 2016 в 19:18
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
Если на входе строка, то можно поступить следующим способом (код можно проверить здесь). Преобразовывать в числа или нет — смотрите сами (в данном варианте перед выводом преобразуются).
#include #include #include #include int main() < std::string str= "1 2 3 5 104 1034"; std::stringstream ss(str); std::vector v; for(std::string word;ss>>word;v.push_back(word)); for(auto&x:v)std::cout
Отслеживать
ответ дан 7 мар 2016 в 19:20
3,351 1 1 золотой знак 10 10 серебряных знаков 25 25 бронзовых знаков
Код работает, спасибо. Не могли бы вы объяснить как он работает?
7 мар 2016 в 19:33
Пожалуйста. Но что именно в нем непонятно? Может уточните? А если в общих чертах, то мы имеем строку. Эту строку «преобразуем» в поток. Если понятнее, то в объект, аналогичный тому же cin или сout (стандартным потокам ввода или вывода). Далее создаем наш вектор вектор (пустой изначально). В цикле считываем из потока слова. Как в стандартном потоке ввода пробел будет являться разделителем. Т.е. по сути будет происходить нечто аналогичное, как в ответе Harry, только уже постфактум. Ну и в конце в цикле выводятся значения из векторов.
7 мар 2016 в 19:41
Можно использовать stringstream и например istream_iterator
std::string s = "1 20 30"; std::stringstream stream(s); std::istream_iterator first(stream), last; std::vector v(first, last);
Отслеживать
ответ дан 7 мар 2016 в 19:21
30.9k 13 13 золотых знаков 96 96 серебряных знаков 157 157 бронзовых знаков
Вряд ли ТС-у понятно, как это может работать (например, зачем тут last (это некое магическое слово в данном контексте?), каким образом этот итератор взаимодействует с first (который довольно очевидно (или не очень очевидно?) связан с исходной строкой)?)
7 мар 2016 в 20:41
Ну, хоть намекните, что istream_iterator last default инициалиpуется состоянием EOF (или как там у вас правильно?) и поэтому в range-конструкторе вектора задает диапазон с открытой верхней границей.
7 мар 2016 в 22:08
Смысл тот же, поскольку файл это тоже последовательность байтиков. А написано так: This kind of iterator has a special state as an end-of-stream iterator, which is acquired when the end of the stream is reached (надеюсь, теперь наш знаток питона въедет в суть крестов).
Как инициализировать вектор в c
Вектор представляет контейнер, который содержит коллекцию объектов одного типа. Для работы с векторами необходимо включить заголовок:
#include
Определим простейший вектор:
std::vector numbers;
В угловых скобках указывается тип, объекты которого будут храниться в векторе. То есть вектор numbers хранит объекты типа int. Однако такой вектор пуст. Он не содержит никаких элементов.
Но мы можем инициализировать вектор одним из следующих способов:
std::vector v1; // пустой вектор std::vector v2(v1); // вектор v2 - копия вектора v1 std::vector v3 = v1; // вектор v3 - копия вектора v1 std::vector v4(5); // вектор v4 состоит из 5 чисел, каждое число равно 0 std::vector v5(5, 2); // вектор v5 состоит из 5 чисел, каждое число равно 2 std::vector v6; // вектор v6 состоит из чисел 1, 2, 4, 5 std::vector v7 = ; // вектор v7 состоит из чисел 1, 2, 3, 5
Важно понимать отличие в данном случае круглых скобок от фигурных:
std::vector v1(5); // вектор состоит из 5 чисел, каждое число в векторе равно 0 std::vector v2; // вектор состоит из одного числа, которое равно 5 std::vector v3(5, 2); // вектор состоит из 5 чисел, каждое число равно 2 std::vector v4; // вектор состоит из двух чисел 5 и 2
При этом можно хранить в векторе элементы только одного типа, который указан в угловых скобках. Значения других типов в вектор сохранить нельзя, как например, в следующем случае:
std::vector v;
Обращение к элементам и их перебор
Для обращения к элементам вектора можно использовать разные способы:
- [index] : получение элемента по индексу (также как и в массивах), индексация начинается с нуля
- at(index) : функция возращает элемент по индексу
- front() : возвращает первый элемент
- back() : возвращает последний элемент
Выполним перебор вектора и получим некоторые его элементы:
#include #include int main() < std::vectornumbers ; int first = numbers.front(); // 1 int last = numbers.back(); // 5 int second = numbers[1]; // 2 std::cout << "first: " << first << std::endl; std::cout << "second: " << second << std::endl; std::cout << "last: " << last << std::endl; numbers[0] = 6; // изменяем значение for(int n : numbers) std::cout << n << "\t"; // 6 2 3 4 5 std::cout
При этом следует учитывать, что индексация не добавляет элементов. Например, если вектор содержит 5 элементов, то мы не можем обратиться к шестому элементу:
std::vector numbers ; numbers[5] = 9;
При таком обращении результат неопределен. Некоторые комиляторы могут генерировать ошибку, некоторые продолжат работать, но даже в этом случае такое обращение будет ошибочно, и оно в любом случае не добавит в вектор шестой элемент.
Чтобы избежать подобных ситуаций, можно использовать функцию at() , которая хотя также возвращает элемент по индексу, но при попытке обращения по недопустимому индексу будет генерировать исключение out_of_range :
#include #include #include int main() < std::vectornumbers < 1, 2, 3, 4, 5>; try < int n = numbers.at(8); >catch (std::out_of_range e) < std::cout >
Вектор векторов инициализация
Вопрос по поводу работы с двумерными векторами(«матрицами»).
Например, необходимо создать матрицу 10х10 и инициализировать её 1-чками.
Для одномерного массива это
vector int> myVect(10, 1);
А для двумерного?
vector vector int> > myVect(10, vector int> (10, 1) );
Выглядит громоздко и, судя по всему, неверно. Подскажите, как надо.
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Добавление элементов в многомерный вектор (вектор векторов)
Я могу создавать двухмерный вектор таким способом: vector<vector<int>> a; Он представляет из себя.
Разбить вектор на вектор векторов по разделителю
По простому сделал for (size_t i = 0; i < new_arr.size(); i++) < .

Инициализация элементов вектор
В программе создается вектор и первому элементу вектора присваивается объект класса TestClass.
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
Я бы как-то так написал .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#include #include using namespace std; int main() { typedef std::vectorint> ArrayLine; typedef std::vectorArrayLine> MyArray; MyArray myVect; const int size = 10; const int defaultValue = 1; myVect.reserve(size); for(int i = 0; i size; ++i) myVect.emplace_back(ArrayLine(size, defaultValue)); for(auto& outIt : myVect) { for(auto& inIt : outIt) cout <" "; cout ; } }
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
Сообщение от NikBond 
Выглядит громоздко и, судя по всему, неверно. Подскажите, как надо.
у вас правильно
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
NikBond,
1 2 3 4 5 6 7 8 9 10 11
vectorvectorint>> v = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 0 }, }; for (auto i : v) { for (auto j : i) { cout <" "; } cout ; }
Регистрация: 21.07.2015
Сообщений: 36
Спасибо всем.
Еще вопрос в догонку. Как обходить двумерные вектора в цикле без range-based for?
Вот здесь, к примеру, что писать в условии внутреннего цикла?
1 2 3 4
for(int i; i myVect.size(); i++){ for(int j; j /* что здесь? */; j++){ }
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Сообщение было отмечено NikBond как решение
Решение
myVect[i].size()
![]()
![]()
5277 / 2364 / 342
Регистрация: 20.02.2013
Сообщений: 5,763
Записей в блоге: 20
Сообщение от rikimaru2013 
myVect[i].size()
И чтобы компилятор ворнинги не кидал, тип счётчиков лучше сделать size_t :
1 2 3 4 5
for(size_t i; i myVect.size(); i++) for(size_t j; j myVect[i].size(); j++) { // some code }
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Вектор векторов
Нужно научиться создавать вектор в векторе, нашёл такой сайт но остались некоторые вопросы.
Вектор векторов
Вектор векторов — плюсы и минусы, альтернативы. Подскажите новичку) P.S. Внутри массив из 2х.
Вектор векторов
Хочу создать вектор, содержащий векторы, которые содержат строки. Написал такой код: #include.
Вектор векторов string
Нужно реализовать класс Table, который содержит вектор векторов string и методы для работы с этой.