Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2019, 12:46   #1
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию C++ - в чем разница двух объявлений вектора?

Добрый день

Вопрос возник такой. Вот два способа объявления вектора.
Код:
vector <int> myVector(10);
и
Код:
vector <int> myVector;
myVector.reserve(10);
Кроме того, что в первом случае вектор сразу забивается нулями, он и работает потом по-разному. Например, попытка получения размера с помощью size() выдает ноль, даже если перед этим в него был записан десяток элементов.

А попытка переписать элементы в другой вектор и глянуть потом на них вообще сносит программу. Если объявить myVector первым способом, все работает.

Код:
vector <int> myVector;
myVector.reserve(10);
for (int i=0;i<10;i++) myVector[i] = i;

vector <int> myVector1(myVector);

for (int i=0;i<10;i++) cout << myVector1[i] << " " ;
В чем принципиальная разница между этими двумя объявлениями вектора?
archerix вне форума Ответить с цитированием
Старый 31.10.2019, 12:54   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

1. Это не два объявления вектора.
2.
Код:
vector <int> myVector(10);
https://en.cppreference.com/w/cpp/co.../vector/vector
Цитата:
Constructs the container with count default-inserted instances of T. No copies are made.
3.
Код:
myVector.reserve(10);
https://en.cppreference.com/w/cpp/co...vector/reserve
Цитата:
Increase the capacity of the vector to a value that's greater or equal to new_cap. If new_cap is greater than the current capacity(), new storage is allocated, otherwise the method does nothing.

reserve() does not change the size of the vector.
Т.е. все работает как положено. Вы пробовали документацию читать?
p51x вне форума Ответить с цитированием
Старый 31.10.2019, 13:02   #3
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Читал статью в интернетах, из которой сложилось впечатление, что это эквивалентно Там про эти два варианта сказано:

Эта запись эквивалентна двум предыдущим, то есть здесь мы объявили вектор с начальным размером в 10 элементов типа int. Но кроме этого, такой способ объявления вектора не просто выделяет память, но и еще инициализирует все элементы вектора нулями.

Я и подумал, что кроме предварительного забития нулей это одно и то же, и удивился, почему не работает одинаково. Видимо, недопонял.
archerix вне форума Ответить с цитированием
Старый 31.10.2019, 13:04   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от archerix Посмотреть сообщение
но и еще инициализирует все элементы вектора нулями
и у вас 10 элементов в векторе, а не просто у него зарезервирована память
p51x вне форума Ответить с цитированием
Старый 31.10.2019, 13:06   #5
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Но ведь я их заполнял руками.
Код:
    vector <int> myVector;
    myVector.reserve(10);
    for (int i=0;i<10;i++) myVector[i] = i;

    cout << myVector.size();
Все равно ноль
archerix вне форума Ответить с цитированием
Старый 31.10.2019, 13:08   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Там нет элементов. оператор [] не вставляет элементы в вектор
https://en.cppreference.com/w/cpp/co...or/operator_at
Код:
Returns a reference to the element at specified location pos. No bounds checking is performed.
Цитата:
Notes
Unlike std::map:perator[], this operator never inserts a new element into the container.
p51x вне форума Ответить с цитированием
Старый 31.10.2019, 13:14   #7
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Видимо, я самую суть не ухватываю пока что Size да, выдает, что нет элементов, но вот же они, я их вижу


Код:
    vector <int> myVector;
    myVector.reserve(10);
    for (int i=0;i<10;i++) myVector[i] = i;
    for (int i=0;i<10;i++) cout << myVector[i] << " " ;
    cout << myVector.size();
archerix вне форума Ответить с цитированием
Старый 31.10.2019, 13:16   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Потому что вы сказали вектору зарезервировать память и залезли в нее.
p51x вне форума Ответить с цитированием
Старый 31.10.2019, 13:17   #9
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Пошел думать
archerix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны два вектора b=(b1,b2,...,b6),x=(x1,x2,...,x6) и матрица А(6х6).написать программу вычисления длины вектора Ax-b. infern_o Паскаль, Turbo Pascal, PascalABC.NET 10 21.03.2013 10:50
Разница двух диапазонов в список. KOSTIK1 Microsoft Office Excel 15 17.01.2012 14:09
Нужна пр-ма для скачивания базы объявлений с сайтов-досок объявлений fine09 Фриланс 1 17.09.2011 22:19
Какая разница в двух строках? bullvinkle HTML и CSS 2 07.12.2009 18:17