Как сделать динамическое увеличение кол-ва структур?
В начале программа копирует список камер в массив структур из mysql . Список камер в mysql будет со временем увеличиваться. Как сделать чтоб программа увеличивала место в зависимости от кол-ва камер. Сейчас у меня вот так:
struct _cam_list
{
char id [10];
char ip_nvr[50];
char ip_addr[50];
int ch_num;
};
_cam_list cam_list[100] = {} ;
1 камера = 1 структура.
т.е. имеется массив 100 структур для максимум ста камер. Если камер будет 500 или 2000, нужно ешо больше выделить память, хотелось бы сделать динамическое увеличение. Может быть следует использовать вектора или есть какие-либо другие способы?
Если у вас С++, а не чистый Си, то конечно используют std::vector. А вместо char[] используют std::string.
Если Си, то придётся выделять динамически через malloc.
jtag_: это не то, что нормально, других вариантов у вас не остаётся, если не брать сторонние библиотеки.
Векторы для этого и предназначены в C++. Просто, вы с чистым Си путаете это всё.
В C++ 90% данных в векторах хранятся. Это самый эффективный и универсальный контейнер в языке. Пользуйтесь им, не задумываясь.
Вообще в с++ структуры часто используются для хранения?
Ну, они только и используются, потому что для этого и предназначаются изначально. Других вариантов нет пока что.
Денис Загаевский: удобная обёртка над массивом, это std::array.
А вектор самая простая и эффективная структура из всех созданных. Если не знаешь куда что-либо запихнуть, не понимаешь или нет времени разбираться с О-сложностью операций над различными контейнерами — юзай вектор.
Денис Загаевский: ну, в прямом. Не нужно ничего знать для новичка, никаких тонкостей. Сама за тебя память выделяет, сама подчищается за собой, самый дружественный к кешу контейнер, и т. д.
У самого Страуструпа даже есть выступление, где он говорит, что все ваши костыли из непонятных структур можно заменить одним вектором, написать небольшой прокси или адаптер сверху, и будет в разы эффективнее, чем было у вас раньше.
Те же списки одно\двусвязные учат в универах и во все щели их пихают. Но никто не учит почему-то, что cache miss при их использовании стремится к 100%. А реальных случаев, где нельзя заменить списки на вектор, практически нет.
Денис Загаевский: ну да. В 90% задач именно оно и требуется.
А если брать бустовые смарт векторы, то что ещё нужно?
Да, ещё без хеш-таблиц не обойтись, конечно же. Но это уже специфика. Их и не юзают те, кто не понимают, зачем они нужны. В отличие от тех же списков, очередей, стеков и прочих универских мастхевов, которые сплошь и рядом мис-юзят даже преподы в универах.
Дмитрий: Список, очередь, стек и прочее - это абстракция. И весьма полезная. Если вы под списком понимаете связный список, у меня для вас плохие новости.
Как уже советовали, проще всего использовать std::vector. Но тут важно понимать то, что при перевыделении памяти элементы вектора копируются. Поэтому если можно посмотреть в сторону std::list или хранить структуры по указателям в векторе.