Здравствуйте. У меня есть массив элементов Table, каждый из которых представляет собой структуру типа: struct test{ vector<int> a; vector<int> b }; В каждом элементе-структуре массивы a и b около 2000 байт каждый. Работаю в режиме постоянного добавления элементов Table в конец и удаления части элементов из начала этого массива. Суммарное число вставленных/удаленных записей массива Table оч. большое. Есть два варианта реализации массива Table: 1) vector<struct test> Table, и в каждый элемент запиывать структуру,содержащую массивы a и b. 2) vector<struct test *> Table, и в каждый элемент записывать ссылку на вновь созданный элемент, содержащий векторы a и b. Но во втором варианте, как я предполагаю, при удалении элементов Table, дополнительно придется самостоятельно уничтожать соотвествующий элемнт-струтуру, т.к. скорее всего, автоматически этого делатся не будет. Подскажите, пожалуйста, какой вариант более быстрый.
Провел такое практическое сравнение: для простоты вместо struct test взял vector_element. 1) Код (Text): typedef vector<int> vector_element; test_el vector_element; vector<vector_element> v1; vector<vector_element > ::iterator it ; // создаем переменную типа vector_element (массив 1000 элементов) for(int i=0; i<1000;i++) test_el.push_back(i); //вставляем 2000 элементов vector_element for(int i=0;i<2000;i++) v1.push_back(test_el); // переходим к режиму моделирования режима работы: 1000 вставок/удалений по 2000-элементов за раз. for(int j=0; j<1000;j++) { int t=v1.size(); //добавляем еще 2000 элементов for(int i=0;i<2000;i++) v1.push_back(test_el); <...обработка...> //удаление из начала вектора iti=v1.begin(); advance(it,t); // удаляю первые 2000 элементов v1.erase(v1.begin(),it); } 2) Код (Text): typedef vector<int> vector_element; test_el vector_element; vector<vector_element *> v2; // теперь в массиве будем хранить ссылки на элементы-вектора vector<vector_element > ::iterator it ; // точно так же создаем переменную типа vector_element (массив 1000 элементов) for(int i=0; i<1000;i++) test_el.push_back(i); //вставляем первые 2000 элементов указателей на vector_element for(int i=0;i<2000;i++) { v2.push_back(new vector_element); *v2[i]=test_el; //по адресу v2[i] записываем test_el } // переходим к режиму моделирования режима работы: 1000 вставок/удалений по 2000-элементов за раз. for(int j=0; j<1000;j++) { int t=v2.size(); //добавляем еще 2000 элементов for(int i=0;i<2000;i++) { v2.push_back(new vector_element); *v2[i]=b; //по адресу v2[i] записываем test_el } <...обработка...> //удаление из начала вектора [b]//сначала элементы-векторы, ссылки на которые хранятся в массиве v2; delete вызывает деструкторы for(int n=0;n<t;n++) { delete v2[n]; } [/b] it=v2.begin(); advance(it,t); v2.erase(v2.begin(),it); } При данных параметрах время выполнения в секундах составило 128 и 108 соответственно. Корректно ли такое сравнение? М.б. я что-то упустил из внимания?
В 2) опечатка: второй раз при добавлении элементов нужно писать, не Код (Text): *v2[i]=b; , а Код (Text): *v2[t+i]=b; Как узнать, действительно ли освободилась память при удалении векторов-элементов после Код (Text): for(int n=0;n<t;n++) { delete v2[n]; } ?
а не лучше ли тогда использовать список вместо вектора? я, конечно, не знаток, но вектор вроде как при удалении элементов из начала копирует на их место последующие, так?
Да, при добавлении/удалении "больших" элементов список действительно действует побыстрее. И теория и практика это подтверждает. Зато отсуствует возможность обращени к элементу по индексу. Я все в комплексе оценил и решил использовать вектор. А вот уже здесь возник вопрос - а не хранить ли в элементах вектора только указатели на него.
почему бы она не освободилась-то? ну, если не доверять компилятору - valgrind или другой memory debugger в помощь.
Сомнения не в компиляторе, а в том - корректно ли я применяю оператор delete к указателю на элемент-вектор. (без [] например )