Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2009, 11:13   #1
Pahan
 
Регистрация: 24.01.2009
Сообщений: 7
По умолчанию Что будет работать быстрее??

Здравствуйте всем.
У меня есть массив элементов 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, дополнительно придется самостоятельно уничтожать соотвествующий элемнт-струтуру, т.к. скорее всего, автоматически этого делатся не будет.
Подскажите, пожалуйста, какой вариант более быстрый.
Pahan вне форума Ответить с цитированием
Старый 20.12.2009, 11:42   #2
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Ну 100% тебе не скажу, но, думается, со ссылками быстрее будет...
В таком случае может вообще список какой-нибудь сделать динамический?
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 20.12.2009, 12:17   #3
Pahan
 
Регистрация: 24.01.2009
Сообщений: 7
По умолчанию

Я проверял практически - c list действительно побыстрее работает, но мне нужно использовать доступ через индекс.
Если ссылки в векторе хранить, то это примерно так будет:
Код:
Table[i]=(struct test*) malloc(sizeof(struct test));
Table[i]->a.push_back(1);
Table[i]->b.push_back(2);
...
Table[i].free; // удаляем элемент-структуру вместе с обоими массивами 
                   // a и b
Table.erase(Table.erase(Table.begin()+i));
??
Если да, то где в таком случае будет вызван деструктор для векторов a и b?

Последний раз редактировалось Pahan; 20.12.2009 в 12:20.
Pahan вне форума Ответить с цитированием
Старый 20.12.2009, 13:18   #4
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

По списку тоже можно по идее с помощью индекса работать
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 20.12.2009, 15:35   #5
Pahan
 
Регистрация: 24.01.2009
Сообщений: 7
По умолчанию

Провел такое практическое сравнение:
для простоты вместо struct test взял vector_element.

1)
Код:
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)


Код:
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
      }

   <...обработка...>
  //удаление из начала вектора
//----------------------------------------------   
  //сначала элементы-векторы, ссылки на которые хранятся в массиве v2; delete вызывает деструкторы
  for(int n=0;n<t;n++)
     {
       delete v2[n];
     }

//----------------------------------------------
   it=v2.begin();
   advance(it,t);

   v2.erase(v2.begin(),it);
 }
При данных параметрах время выполнения в секундах составило 128 и 108 соответственно.
Корректно ли такое сравнение? М.б. я что-то упустил из внимания?
Pahan вне форума Ответить с цитированием
Старый 20.12.2009, 18:48   #6
Pahan
 
Регистрация: 24.01.2009
Сообщений: 7
По умолчанию

Код:
//сначала элементы-векторы, ссылки на которые хранятся в массиве v2; delete вызывает деструкторы
  for(int n=0;n<t;n++)
     {
       delete v2[n];
     }
Как вообще проверить, что данный код отрабатывает правильно и память из под элементы-вектора(элемента, который сам по себе является вектором) действительно освобождается и нет ее утечки?
Pahan вне форума Ответить с цитированием
Старый 20.12.2009, 19:07   #7
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от Pahan Посмотреть сообщение
Код:
//сначала элементы-векторы, ссылки на которые хранятся в массиве v2; delete вызывает деструкторы
  for(int n=0;n<t;n++)
     {
       delete v2[n];
     }
Как вообще проверить, что данный код отрабатывает правильно и память из под элементы-вектора(элемента, который сам по себе является вектором) действительно освобождается и нет ее утечки?
Возьми да напиши в деструкторе cout <<"Udaleno";
что - нибудь в этом духе
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 20.12.2009, 19:43   #8
Pahan
 
Регистрация: 24.01.2009
Сообщений: 7
По умолчанию

Как получить доступ к коду деструктора типа vector_element??
Pahan вне форума Ответить с цитированием
Старый 20.12.2009, 19:43   #9
Pahan
 
Регистрация: 24.01.2009
Сообщений: 7
По умолчанию

К коду деструктора типа vector_element
Pahan вне форума Ответить с цитированием
Старый 20.12.2009, 21:24   #10
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от Pahan Посмотреть сообщение
К коду деструктора типа vector_element
Я не очень вдумывался в суть задания - для библиотечного типа скорее всего никак, поэтому можно попробовать переписать его...
Думаю, это можно решить с помощью наследования...
Но категорически не уверен, не принимай на веру
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Принтер будет работать лучше если узнает что его ждет в случае .. HellMercenariess Компьютерное железо 3 09.11.2009 09:59
Что быстрее?! Dimedrolum Общие вопросы C/C++ 5 14.10.2009 11:57
Как заставить TTimer работать быстрее? Вадим Буренков Общие вопросы Delphi 5 21.07.2009 09:08
Метод для класса который будет работать с будующим экземпляром SunKnight Общие вопросы .NET 7 12.05.2009 20:25
Seagate - ST3320620AS 320Gb. работает в режиме SATA1 и может работать в двое быстрее, как настроить? MacTiger Компьютерное железо 1 21.04.2009 04:57