Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 2
Регистрация: 24.06.2012
Сообщений: 112
1

В каком STL-контейнере лучше хранить объекты?

14.09.2016, 19:31. Просмотров 1444. Ответов 26


Есть класс, реализующий адреса
C++
1
2
3
class address {
...
}
Поискал в сети увидел 3 варианта хранения объектов : массив(array), вектор(vectro), список(list).
Массив нельзя создать неизвестного размера, нужно сразу выделять память, например
C++
1
2
address *ad_array[100]; //работает
address *ad_array[]; //ошибка
Такой вариант не подходит, неизвестно сколько будет объектов.
Вектора, все бы ничего, но удалять говорят тут не правильно их, хотя и можно так:
C++
1
2
3
vector<address> ad_vector();
ad_vector.push_back(address());
v.erase( remove( ad_vector.begin(), ad_vector.end()), ad_vector.end() );
С list еще ничего не делал. Как правильнее поступать с объектами?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.09.2016, 19:31
Ответы с готовыми решениями:

Как хранить объекты разных классов в одном контейнере
Здравствуйте! Хочу реализовать хранение разных классов(базовый и наследник) в одном контейнере....

В каком формате лучше хранить локальную БД
Всем доброго времени суток. Не знаю в какой раздел поместить - по этому извините,спрошу здесь....

В каком формате лучше хранить образ ОС?
В .dmg или в .iso лучше? Если сохраняю

В каком формате лучше хранить историю работы приложения?
Подскажите, в чем обычно хранят данные различные игры под windows, которые не онлайн? Просто в...

26
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
14.09.2016, 19:34 2
Цитата Сообщение от Leffken Посмотреть сообщение
Вектора, все бы ничего, но удалять говорят тут не правильно их
Кого их?
0
0 / 0 / 2
Регистрация: 24.06.2012
Сообщений: 112
14.09.2016, 19:48  [ТС] 3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Кого их?
Объекты (элементы вектора)

Добавлено через 2 минуты
Кстати удаление вектора не правильно написал
C++
1
ad_vector.erase(ad_vector.begin()+number_of_delete_object);
0
"C with Classes"
1621 / 1244 / 474
Регистрация: 16.08.2014
Сообщений: 5,218
Записей в блоге: 1
14.09.2016, 20:00 4
Цитата Сообщение от Leffken Посмотреть сообщение
Поискал в сети увидел 3 варианта хранения объектов : массив(array), вектор(vectro), список(list).
Нужно выбрать оптимальный контейнер под свою задачу. Вектор самый универсальный (естественно за универсальность нужно платить), массив самый быстрый (если ты его грамотно будешь использовать) и как следствие самый не удобный в использовании.
1
191 / 127 / 52
Регистрация: 19.01.2010
Сообщений: 518
14.09.2016, 20:48 5
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Я нередко смотрю сюда
Источник: https://habrahabr.ru/company/i... og/194726/
2
Миниатюры
В каком STL-контейнере лучше хранить объекты?  
0 / 0 / 2
Регистрация: 24.06.2012
Сообщений: 112
14.09.2016, 23:05  [ТС] 6
Цитата Сообщение от Selot Посмотреть сообщение
Я нередко смотрю сюда
Источник: https://habrahabr.ru/company/i... og/194726/
Спасибо, интересная схема, в закладки)

Добавлено через 43 секунды
Цитата Сообщение от _stanislav Посмотреть сообщение
Нужно выбрать оптимальный контейнер под свою задачу. Вектор самый универсальный (естественно за универсальность нужно платить), массив самый быстрый (если ты его грамотно будешь использовать) и как следствие самый не удобный в использовании.
А про list что можешь добавить?
0
"C with Classes"
1621 / 1244 / 474
Регистрация: 16.08.2014
Сообщений: 5,218
Записей в блоге: 1
15.09.2016, 00:00 7
Цитата Сообщение от Leffken Посмотреть сообщение
А про list что можешь добавить?
std::list двусвязный список, для обхода каждого элемента по очереди.

Добавлено через 5 минут
Список представляет собой контейнер, который поддерживает быструю вставку и удаление элементов из любой позиции в контейнере. Быстрый произвольный доступ не поддерживается. Он реализован в виде двусвязного списка. В отличие от std::forward_list этот контейнер обеспечивает возможность двунаправленного итерирования, являясь при этом менее эффективным в отношении используемой памяти. http://ru.cppreference.com/w/cpp/container/list
0
801 / 531 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
15.09.2016, 00:24 8
Где лучше хранить объекты?
В компьютере.
0
2605 / 2195 / 234
Регистрация: 03.07.2012
Сообщений: 7,916
Записей в блоге: 1
15.09.2016, 09:39 9
Цитата Сообщение от _stanislav Посмотреть сообщение
массив самый быстрый
Чем он принципиально быстрее вектора (когда размер известен)?
0
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
15.09.2016, 10:35 10
zer0mail, так массив/std::array на стеке располагает свои данные - думаю он быстрее по определению.
0
Эксперт .NET
8649 / 6109 / 1019
Регистрация: 21.01.2016
Сообщений: 23,064
15.09.2016, 10:59 11
rikimaru2013, доступ к массиву в стёке происходит быстрее, чем в куче ?
0
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
15.09.2016, 11:04 12
Usaga, я предполагаю, что да. Программе надо спросить у ОС дать ей что-то по адресу 0х1000, а при работе с стеком - не надо ни у кого спрашивать.
0
"C with Classes"
1621 / 1244 / 474
Регистрация: 16.08.2014
Сообщений: 5,218
Записей в блоге: 1
15.09.2016, 11:12 13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Программе надо спросить у ОС дать ей что-то по адресу 0х1000, а при работе с стеком - не надо ни у кого спрашивать.
Логично, одному танцевать всегда удобней чем вдвоем.
0
2605 / 2195 / 234
Регистрация: 03.07.2012
Сообщений: 7,916
Записей в блоге: 1
15.09.2016, 11:14 14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а при работе с стеком - не надо ни у кого спрашивать
Ну попроси у стека гигабайт.
0
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
15.09.2016, 11:15 15
У меня есть предположения, что 2 код отработает быстрее чем 1, так как компилятор знает все углы при компиляции.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    std:vector<int> arr1;
    arr1.push_back( 1 );
    arr1.push_back( 2 );
    arr1.push_back( 3 );
    
    int arr2[ 3 ];
 
 
    for ( const auto& it : arr1 )               // 1
    {
    }
 
    for ( const auto& it : arr2 )               // 2
    {
    }
}
Добавлено через 1 минуту
_stanislav, zer0mail, Рад за конструктивную критику для помощи мне разобраться в вопросе. Петросяны.
0
Падаван С++
445 / 259 / 89
Регистрация: 11.11.2014
Сообщений: 908
15.09.2016, 11:21 16
Цитата Сообщение от zer0mail Посмотреть сообщение
Ну попроси у стека гигабайт
вы вопрос задавали по поводу скорости доступа а не ограничениях в памяти, естественно вам в стеке столько не получить но допустим небольшие массивы хранить можно, к примеру список игроков на сервере если их кол-во ограничено 10 допустим и тд.
0
"C with Classes"
1621 / 1244 / 474
Регистрация: 16.08.2014
Сообщений: 5,218
Записей в блоге: 1
15.09.2016, 12:17 17
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Рад за конструктивную критику для помощи мне разобраться в вопросе. Петросяны.
Я не критиковал, а согласиться, привел аналогию и улыбнулся. а ты сразу петросяны.
Естественно работать со стеком быстрее чем с кучей.

Добавлено через 31 минуту
rikimaru2013,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vector>
#include <ctime>
 
int main(int argc, char* argv[] )
{
    const size_t size = 10000;
    size_t start_time = clock();
 
    std::vector<int> array_(size);
    //size_t array_[size];
 
    for (size_t i = 0; i < size; i++)
        for (size_t j = 0; j < size; j++)
               array_[j] = j;
 
    size_t end_time = clock();
    size_t search_time = end_time - start_time;
 
    return 0;
}
vector существенно дольше.
1
Эксперт С++
8402 / 3939 / 862
Регистрация: 15.11.2014
Сообщений: 8,885
15.09.2016, 12:27 18
Цитата Сообщение от zer0mail Посмотреть сообщение
Ну попроси у стека гигабайт
проблемы?
https://msdn.microsoft.com/ru-... hxaks.aspx
0
"C with Classes"
1621 / 1244 / 474
Регистрация: 16.08.2014
Сообщений: 5,218
Записей в блоге: 1
15.09.2016, 13:06 19
Цитата Сообщение от hoggy Посмотреть сообщение
проблемы?
vs 13 у меня не получилось стек увеличить.
0
918 / 635 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
15.09.2016, 14:46 20
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
У меня есть предположения, что 2 код отработает быстрее чем 1, так как компилятор знает все углы при компиляции.
Конкретизируйте, какие углы вы имеете в виду. На большинстве архитектур скорость доступ к куче и стеку одинаковы.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Программе надо спросить у ОС дать ей что-то по адресу 0х1000, а при работе с стеком - не надо ни у кого спрашивать.
После выделения этот адрес уже в адресносном пространстве программы и не нужно ничего спрашивать у системы.
Есть, конечно, нюансы. На многих системах выделение будет витруальным и первый запрос на чтение/запись будет действительно выполняться долго. Но такое бывает не всегда.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2016, 14:46

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

ПС Сервисный центр. В каком виде лучше хранить информацию
Здравствуйте. Мы изучаем в колледже C#. Задали курсовую работу. Я выбрал работу &quot;сервисный центр&quot;,...

Автодополнение функций: в каком объекте лучше хранить их спосок
День добрый, Пишу свой редактор javascript с базой данных(пока Access) интересуют варианты...

Где и в каком виде лучше всего хранить данные, загруженные из БД
Здравствуйте. При загрузке страницы, происходит обращение к бд, таким образом я получаю некоторую...

В каком формате лучше хранить текст для корректной обработки в дальнейшем?
есть строка #1#0#31#2 в каком формате ее хранить? что бы потом корректно прочитать Добавлено...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.