Как лучше хранить данные в контейнере Vector?

Тема в разделе "WASM.BEGINNERS", создана пользователем Pahan, 20 дек 2009.

  1. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    Здравствуйте.
    У меня есть массив элементов 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, дополнительно придется самостоятельно уничтожать соотвествующий элемнт-струтуру, т.к. скорее всего, автоматически этого делатся не будет.
    Подскажите, пожалуйста, какой вариант более быстрый.
     
  2. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    Провел такое практическое сравнение:
    для простоты вместо struct test взял vector_element.

    1)
    Код (Text):
    1. typedef vector<int> vector_element;
    2. test_el vector_element;
    3. vector<vector_element> v1;
    4. vector<vector_element > ::iterator it ;
    5.  
    6. // создаем переменную типа vector_element (массив  1000 элементов)
    7.  for(int i=0; i<1000;i++)
    8.     test_el.push_back(i);
    9. //вставляем 2000 элементов vector_element
    10. for(int i=0;i<2000;i++)
    11.    v1.push_back(test_el);  
    12.  
    13. // переходим к режиму моделирования режима работы: 1000 вставок/удалений по 2000-элементов за раз.
    14. for(int j=0; j<1000;j++)
    15. {
    16.   int t=v1.size();
    17.      //добавляем еще 2000 элементов
    18.   for(int i=0;i<2000;i++)
    19.       v1.push_back(test_el);
    20.    
    21.    <...обработка...>
    22.   //удаление из начала вектора
    23.  
    24.   iti=v1.begin();
    25.   advance(it,t);
    26.   // удаляю первые 2000 элементов
    27.   v1.erase(v1.begin(),it);
    28.  }
    2)

    Код (Text):
    1. typedef vector<int> vector_element;
    2. test_el vector_element;
    3. vector<vector_element *> v2; // теперь в массиве будем хранить ссылки на элементы-вектора
    4. vector<vector_element > ::iterator it ;
    5.  
    6. // точно так же создаем переменную типа vector_element (массив  1000 элементов)
    7.  for(int i=0; i<1000;i++)
    8.     test_el.push_back(i);
    9. //вставляем первые 2000 элементов указателей на vector_element
    10. for(int i=0;i<2000;i++)
    11.     {
    12.       v2.push_back(new vector_element);
    13.       *v2[i]=test_el; //по адресу v2[i] записываем test_el
    14.      }
    15. // переходим к режиму моделирования режима работы: 1000 вставок/удалений по 2000-элементов за раз.
    16. for(int j=0; j<1000;j++)
    17. {
    18.   int t=v2.size();
    19.   //добавляем еще 2000 элементов
    20.   for(int i=0;i<2000;i++)
    21.       {
    22.       v2.push_back(new vector_element);
    23.       *v2[i]=b;  //по адресу v2[i] записываем test_el
    24.       }
    25.  
    26.    <...обработка...>
    27.   //удаление из начала вектора
    28.    
    29.   [b]//сначала элементы-векторы, ссылки на которые хранятся в массиве v2; delete вызывает деструкторы
    30.   for(int n=0;n<t;n++)
    31.      {
    32.        delete v2[n];
    33.      }
    34. [/b]
    35.    it=v2.begin();
    36.    advance(it,t);
    37.  
    38.    v2.erase(v2.begin(),it);
    39.  }
    При данных параметрах время выполнения в секундах составило 128 и 108 соответственно.
    Корректно ли такое сравнение? М.б. я что-то упустил из внимания?
     
  3. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    В 2) опечатка: второй раз при добавлении элементов нужно писать, не
    Код (Text):
    1. *v2[i]=b;
    , а
    Код (Text):
    1. *v2[t+i]=b;
    Как узнать, действительно ли освободилась память при удалении векторов-элементов после
    Код (Text):
    1.  for(int n=0;n<t;n++)
    2.      {
    3.        delete v2[n];
    4.      }
    ?
     
  4. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    а не лучше ли тогда использовать список вместо вектора? я, конечно, не знаток, но вектор вроде как при удалении элементов из начала копирует на их место последующие, так?
     
  5. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    Да, при добавлении/удалении "больших" элементов список действительно действует побыстрее. И теория и практика это подтверждает. Зато отсуствует возможность обращени к элементу по индексу. Я все в комплексе оценил и решил использовать вектор.
    А вот уже здесь возник вопрос - а не хранить ли в элементах вектора только указатели на него.
     
  6. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    почему бы она не освободилась-то? ну, если не доверять компилятору - valgrind или другой memory debugger в помощь.
     
  7. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    Сомнения не в компиляторе, а в том - корректно ли я применяю оператор delete к указателю на элемент-вектор. (без [] например )
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Pahan
    deque?
     
  9. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Pahan
    а с чего бы вдруг некорректно? обычное удаление объекта.
     
  10. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    Voodoo
    ок, спс