Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
1

Разница в скорости resize/puch_back для вектора

15.07.2019, 16:11. Показов 1583. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

Подскажите пожалуйста, будет ли разница в скорости в применении таким образом resize и push_back для записи в вектор:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<string> Vector;
 
for(int i=0; i<1000; i++)
{
Vector.push_back(i);
}
 
//или
 
for(int i=0; i<1000; i++)
{
Vector.resize(i);
Vector[i]=i;
}
 
// i - заранее не известен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2019, 16:11
Ответы с готовыми решениями:

Resize() для вектора
Привет. Как сделать resize() так, чтобы &quot;свободное пространство&quot; вектора было заполнено нулями...

Найти выражение для: вектора скорости; вектора ускорения; модуля радиус-вектора
Товарищи, помогите пожалуйста решить. Радиус-вектор материальной точки задается выражением:...

Рассчитать вектор скорости имея направление и модуль вектора скорости
Здравствуйте! Нужно рассчитать вектор скорости, имея лишь направление объекта и модуль вектора...

Разница между resize и reserve
Всем доброе утро! Следующий вопрос не дает мне спать по ночам - в чём таки разница между resize и...

10
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.07.2019, 16:21 2
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите пожалуйста, будет ли разница в скорости в применении таким образом resize и push_back для записи в вектор:
Будет - push_back резервирует место под новые элементы - size() * 2; когда capacity() == size()
resize не делает этого, поэтому будет работать медленнее
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
15.07.2019, 16:35 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
resize не делает этого
У меня в студии реализация делает
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
15.07.2019, 16:36 4
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
resize не делает этого, поэтому будет работать медленнее
А может не будем фантазировать и проведем эксперимент? К примеру, gcc при использовании resize выделяет память степенями двойки. Что и логично - зачем авторам gcc делать два разных алгоритма расширения вектора, если можно сделать один и идти пить пиво?
C++
1
2
3
4
5
6
    std::vector<int> array;
    for(std::size_t i=0;i<32;++i)
    {
        array.resize(i);
        std::cout<<i<<" "<<array.capacity()<<std::endl;
    }
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
15.07.2019, 16:38 5
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите пожалуйста, будет ли разница в скорости в применении таким образом resize и push_back для записи в вектор:
Никто не знает, будет ли разница. Где-то будет, где-то не будет. Только эксперимент может показать.
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
15.07.2019, 16:40 6
Цитата Сообщение от zayats80888 Посмотреть сообщение
У меня в студии реализация делает
Правда есть исключение, если newsize превышает oldcapacity + oldcapacity/2, то резервируется newsize. К примеру ТС это не относится
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.07.2019, 16:43 7
Цитата Сообщение от zayats80888 Посмотреть сообщение
У меня в студии реализация делает
В 17-й студии вот так
C++
1
2
3
4
5
6
7
        std::vector<int> vec; 
        vec.push_back(1);
        std::cout << vec.capacity() << std::endl; // cap = 1
        vec.resize(10);
        std::cout << vec.capacity() << std::endl;  // cap = 10
        vec.push_back(1);
        std::cout << vec.capacity() << std::endl;  // cap = 15
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
15.07.2019, 16:47 8
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В 17-й студии вот так
Да я уже упомянул, но если заменить 6 строку на vec.resize(11) вывод не изменится
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.07.2019, 16:52 9
Цитата Сообщение от zayats80888 Посмотреть сообщение
Да я уже упомянул, но если заменить 6 строку на vec.resize(11) ничего не изменится
Ну да, точно.
Тогда - без разницы. Лишнее копирование элемента только.
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
15.07.2019, 17:17 10
извращуги, обсуждать конкретные реализации...
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
18.07.2019, 10:26 11
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите пожалуйста, будет ли разница в скорости в применении таким образом resize и push_back для записи в вектор:
Я думаю, будет.
В вашем примере resize(i) принуждает вектор изменить размер до i. Vector[i]=i; пишет прямо за последним элементом. Допустимый диапазон индексов в С++ при размере i : 0, i-1. Я понимаю, что ошибка механическая, поэтому уточнение не более чем шутка.
Для приведенного примера reserve (1000) до цикла лучше)
0
18.07.2019, 10:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2019, 10:26
Помогаю со студенческими работами здесь

resize вектора векторов
Необходимо удалить n элементов с конца вектора. В vector::erase необходимо передавать итератор....

Resize вектора вызывает ошибку
std::vector&lt;MyClass*&gt; vec; vec.resize(1, NULL) vec = new MyClass(); vec.resize(5, NULL); //...

Разница в скорости выполнения, итераторы
Википедия for (ContainerType::iterator it = C.begin(),end = C.end(); it != end; ++it) { ...

Разница в скорости выполнение программы C++ или C#
И так здравствуйте,хотелось бы узнать почему в данном случае(то есть использование stl) c++...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru