Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/26: Рейтинг темы: голосов - 26, средняя оценка - 4.50
Заблокирован
Эксперт функциональных языков программированияЭксперт С++

Какой массив лучше?

27.07.2021, 21:33. Показов 5458. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже несколько дней не могу понять, какие массивы использовать в своем проекте (нужны int, double, string массивы). Буду работать с элементами массивов с помощью циклов. Размер массивов будет известен при инициализации. Ниже предлагаю реализации трех видов массивов:
a - массив <array>
b - массив <vector>
c - массив с указателем
Обычные массивы не рассматриваю, т.к. функции не способны их возвращать.
Какой массив будет самым быстрым?
C++
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
27
28
29
30
#include <iostream>
#include <array>
#include <vector>
 
int main()
{
    std::array<int, 10> a;
    for (int i = 0; i < 10; i++)
        a[i] = i;
    for (int i : a)
        std::cout << a[i] << " ";
 
    std::cout << "\n";
 
    std::vector<int> b;
    b.reserve(10);
    for (int i = 0; i < 10; i++)
        b.push_back(i);
    for (int i : b)
        std::cout << b[i] << " ";
 
    std::cout << "\n";
 
    int* c = new int [10];
    for (int i = 0; i < 10; i++)
        c[i] = i;
    for (int i = 0; i < 10; i++)
        std::cout << c[i] << " ";
    delete [] c;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.07.2021, 21:33
Ответы с готовыми решениями:

Какой вариант более оптимизирован? Какой лучше выбрать?
Я никак не могу определился, что лучше, и из-за этого я не могу дальше писать код! Написан метод для удаления из массива элемента: ...

Как лучше залить текстуру в массив? Какой формат текстуры лучше использовать?
Как лучше залить текстуру в массив? Какой формат текстуры лучше использовать?

Какой график теста лучше? Какой HDD лучше? Плох ли жесткий диск с большим количеством темно серых блоков?

40
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.07.2021, 14:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _abstract_mem Посмотреть сообщение
То есть имеется ввиду 1 вектор против многих простых динамических массивов? Так наверное да
он имеет ввиду, что вектор оптимизирует реалоки за счет резерва.

допустим, сначала ты выделил память для 10 элементов:
C++
1
int* arr = new int[10];
но затем, тебе вдруг сильно понадобилось добавить 1 элемент в самый конец.
для этого тебе придется:

1. выделить новый блок данных на 1 элемент больше.
2. скопировать все данные из предыдущего в новый блок данных
3. удалить ставшим неактуальным предыдущий блок данных.
4. перенацелить указатель на новый блок данных.

и вот так ты будешь делать каждый раз,
когда тебе понадобится добавить ещё один элемент.

вектор оптимизует эту процедуру.
он выделяет память не на 1 элемент больше, а сразу с запасом.
и пока этот запас не закончился, добавление в конец будет быстрым.
потому что не нужно будет ничего заново ни выделять, ни копировать.

конечно, ты можешь и для обычного сырого указателя
реализовать аналогичную поддержку работы с резервом.

но тогда, полученное в итоге изделие и будет аналогом вектора.
1
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
28.07.2021, 14:46  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Это только если память выделяется однократно.
я писал, что у меня многократно? Зачем снова предлагать этот вектор???
что плохого, когда создаю int* numbers = new int [10];
количество элементов в массиве я точно знаю

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
вдруг сильно понадобилось добавить 1 элемент в самый конец
я точно знаю, что не понадобится
0
6 / 6 / 0
Регистрация: 07.07.2021
Сообщений: 32
28.07.2021, 14:55
Цитата Сообщение от hoggy Посмотреть сообщение
вектор оптимизует эту процедуру.
он выделяет память не на 1 элемент больше, а сразу с запасом.
и пока этот запас не закончился, добавление в конец будет быстрым.
потому что не нужно будет ничего заново ни выделять, ни копировать.
Наверное как-нибудь еще мудрено выделяется запас, интеллектуальным образом, чтобы область была помечена, а при необходимости более приоритетными данным забрана назад.

Цитата Сообщение от Royal_X Посмотреть сообщение
я точно знаю, что не понадобится
У вас простой массив тогда можно фиксированный использовать? Зачем именно через выделение и удаление
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.07.2021, 14:59
Цитата Сообщение от Royal_X Посмотреть сообщение
я писал, что у меня многократно?
В твоей изначальной теме Функция возвращает массив

вызывается функция
C++
1
2
3
4
5
6
int* intArray(int n){
    int* int_array = new int [n];
    for (int i = 0; i < n; i++)
        int_array[i] = i + 1;
    return int_array;
}
и каждый раз, когда её вызываешь, массив у тебя выделяется. Поскольку вызываешь функцию многократно, то и массив у тебя выделяется многократно. А можно было бы сделать, чтоб перевыделалась только тогда, когда её нужно будет больше, что и реализовано внутри vector.

Более того, аналогично работает и std::string, которая хотя и выделена в отдельный класс, не наследуемый напрямую от std::vector, работает по аналогичному принципу.

Добавлено через 3 минуты
Но для того, чтоб вектор использовал свои возможности, а не был неудобной обёрткой для динамически выделенного массива, его нужно создать один раз, и в эту функцию передавать по ссылке/указателю, а в функции - корректировать его размер на n.
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
28.07.2021, 15:01  [ТС]
В моем проекте будут массивы с точным количеством элементов.

многие из них получают константное количество элементов:

C++
1
2
3
4
5
int* fun(){
    int numbers = new int [10];
    //
    return numbers;
}
но есть и такие, которые получают количество из параметра:

C++
1
2
3
4
5
string* textArray(int n){
    string* text_arr = new string [n];
    //
    return text_arr;
}
но в любом случае, количество элементов я знаю и уверен, что не придется добавлять новый элемент в конце массива.

Поэтому я не понимаю, когда мне говорят "используй vector". Я, конечно, понимаю, что vector содержит много свистулек, которые очень полезны для разраба. Но конкретно в моем проекте не вижу смысла усложнить код вектором, когда достаточно обычных указателей.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.07.2021, 15:04
Цитата Сообщение от Royal_X Посмотреть сообщение
но есть и такие, которые получают количество из параметра:
И вместо того, чтобы использовать выделенную на предыдущем вызове память, эти функции снова и снова выделяют себе память по-новой. И от этого всё работает очень медленно.
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
28.07.2021, 15:05  [ТС]
Цитата Сообщение от _abstract_mem Посмотреть сообщение
У вас простой массив тогда можно фиксированный использовать?
конечно, можно. если только я бы знал как возвращать фиксированный обычный массив через функцию.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.07.2021, 15:06
Цитата Сообщение от Royal_X Посмотреть сообщение
многие из них получают константное количество элементов:
И здесь имело бы смысл использовать обычные массивы. Но передающиеся в функцию снаружи, а не создаваемые внутри неё.
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
28.07.2021, 15:06  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
И вместо того, чтобы использовать выделенную на предыдущем вызове память, эти функции снова и снова выделяют себе память по-новой. И от этого всё работает очень медленно.
но ведь значения параметра будут разные. Может памяти от предыдущего вызова будет недостаточно.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.07.2021, 15:06
Цитата Сообщение от Royal_X Посмотреть сообщение
но ведь значения параметра будут разные. Может памяти от предыдущего вызова будет недостаточно.
Значит эти случаи равнозначны, вне зависимости от того, передаёшь ли длину как параметр, или у тебя в коде идёт

C++
1
2
3
4
if(a == 0)
  numbers = new int [10];
else
  numbers = new int [20];

(Хотя в таком случае можно передавать снаружи int a[20], поскольку больших длин у тебя нет, но вернуть не только его, но и "использовавшуюся длину")
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
28.07.2021, 15:11  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Изучи что такое передача по ссылке и что такое указатель.
что тут изучать, когда все программисты на stackoverflow прямо говорят, что в языке C++, функция не может возвращать массив, а может возвращать только указатели на массив. Либо нужно использовать всякие vector, struct, array и прочие танцы с бубном.

Добавлено через 2 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
И от этого всё работает очень медленно.
не уверен, что в моем случае <vector> может иметь преимущество в скорости по сравнению с использованием указателей
0
6 / 6 / 0
Регистрация: 07.07.2021
Сообщений: 32
28.07.2021, 15:13
Цитата Сообщение от Royal_X Посмотреть сообщение
в языке C++, функция не может возвращать массив, а может возвращать только указатели на массив
Ей возвращать даже ничего не нужно, передаете как аргумент, функция работает со ссылкой, для массивов копии не создаются.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.07.2021, 15:15
C++
1
2
std::vector<int> b(10);
int *p_elem = b.data();   // указатель на динамический массив вектора. работоспособен до изменения вектором длины
Добавлено через 1 минуту
Цитата Сообщение от Royal_X Посмотреть сообщение
может иметь преимущество в скорости
В твоём варианте кода, пока не будешь повторно использовать его - да, преимущества никакого не будет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.07.2021, 15:41
Цитата Сообщение от _abstract_mem Посмотреть сообщение
Наверное как-нибудь еще мудрено выделяется запас, интеллектуальным образом, чтобы область была помечена, а при необходимости более приоритетными данным забрана назад.
такого точно нет.
при реалоке, вектор запрашивает данные с запасом,
и на этом вся его магия заканчивается.

за непосредственное выделение памяти (сиреч за распределение ресурсов)
отвечает не сам вектор, а используемый им аллокатор памяти.

это касается не только вектора,
а вообще - любых котейнеров стандартной библиотеки:
все контейнеры одним из параметров принимают тип используемого аллокатора.

у вектора это выглядит так:

C++
1
template < class T, class Alloc = allocator<T> > class vector; // generic template
по умолчанию используется std::allocator

стандартный аллокатор - довольно продуманный и практичный.
лично мне на практике ни разу не понадобилось заменять его на какой либо иной.

но ты, если захочешь, можешь и свой собственный аллокатор использовать.
который ты можешь сделать супер-мега интеллектуальным.
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
28.07.2021, 23:26
Royal_X, я чот не пойму куда ты воюещь
Ты на атмегу проектируешь или какие ещё микроконтроллеры?
Эт всё напоминает тему с какого-то автофорума, где мужик электроны в аккумуляторе экономил.
Цитата Сообщение от Royal_X Посмотреть сообщение
Уже несколько дней не могу понять
Десять раз бы уже написал десять вариантов и сравнил) Задаёшь такие пространные абстрактные вопросы, что просто хочется взять и посмотреть код (рафаела: вместо тысячи слов!)

Конечно, очень полезно разобраться с сырыми указателями сначала, но воевать-то зачем?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
28.07.2021, 23:47
Folian, подписываюсь под каждым словом.

А самое досадное, что потом окажется, что он совсем не в том месте наоптимизировал.
Правда, конечно, если не запускать профайлер, то об этом можно никогда не узнать. Меньше знаешь - крепче спишь, как говорится
1
79 / 53 / 26
Регистрация: 08.09.2019
Сообщений: 141
28.07.2021, 23:49
Цитата Сообщение от hoggy Посмотреть сообщение
он выделяет память не на 1 элемент больше, а сразу с запасом.
Только при использовании метода .reserve() или в общем случае тоже?
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
28.07.2021, 23:55
Цитата Сообщение от DrOffset Посмотреть сообщение
А самое досадное, что потом окажется, что он совсем не в том месте наоптимизировал.
Немаловероятно!

Цитата Сообщение от crazy duck Посмотреть сообщение
Только при использовании метода .reserve() или в общем случае тоже?
А пушбэк как по-твоему работает?
Насколько я читал: если не хватает - удваивает capacity.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2021, 00:56
Цитата Сообщение от crazy duck Посмотреть сообщение
Только при использовании метода .reserve() или в общем случае тоже?
при помощи метода reserve ты можешь заранее застолбить минимально необходимый тебе объём памяти.
и не более того.
к управлению резервом этот метод никакого отношения не имеет.


сама стратегия управления резервом никак не регламентируется.
это значит, что в разных компиляторах она может быть реализована по разному.
единственное: какой бы ни была реализация,
он должна соответствовать некоторыми требованиям.

например, для метода push_back должна гарантироваться "амортизированная сложность"

Амортизированное время выполнения этой операции - O(1).
Амортизированное - значит, что отдельные конкретные операции (при перераспределении памяти) могут выполняться и дольше, но в целом N операций выполнятся за время O(N)...
(ц)Из интернетов
2
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
29.07.2021, 01:28
Цитата Сообщение от Folian Посмотреть сообщение
Насколько я читал: если не хватает - удваивает capacity.
Видимо читал я какую-то модель, конкретно в моей реализацци увеличивает в полтора раза.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2021, 01:28

Какой массив лучше использовать ?
Привет нужно слизать с сайта примерно 20-22 контейнера с кодом в массив , в каждом элементе массива будет примерно 4к символов , так как...

Какой лучше выбрать формат для хранения векторов (массив float) в БД
Имеется массив float размерность его 128 значений (это для одного изображения). Для хранения массивов (векторов) используется SQL Server...

Какая конфигурация лучше? На какой лучше будет тянуть последние игры?
1)Производитель CPU Intel Модель CPU Core i7 - 2630QM Тактовая частота CPU 2.0 ГГц L2 Кэш 6 Мб Набор микросхем Acer Aspire...

У какой из этих видеокарт лучше разгон и вообще какая лучше
Видеокарта PCI-E 2.0 MSI N580GTX-Twin Frozr ll, 1.5Гб, GDDR5, Ret Видеокарта PCI-E 2.0 MSI N570GTX Twin Frozr II/OC, 1.3Гб, GDDR5, OC,...

Какой роутер дешевый лучше купить чтобы лучше ловился интернет из другого дома?
Сейчас роутер DIR_300NRUB5 - скорость падает периодически до нескольких килобит/секунду - перезагрузка не помогает скорость по проводам...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru