Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вектор векторов, vector<vector<>> vs. vector<vector*<>> 
:(
    Опции темы
Djuffin
Дата 22.10.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

Репутация: 1
Всего: 2



Кстати!
Я не советую использовать vector<vector<>>. Это очень полохая практика.
Лучше vector<vector<>*>.

PM MAIL   Вверх
Void
Дата 22.10.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Djuffin @  22.10.2006,  20:14 Найти цитируемый пост)
Я не советую использовать vector<vector<>>. Это очень полохая практика.
Лучше vector<vector<>*>.

ROTFL.
Извиняюсь.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.DUDA
Дата 22.10.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Согласен с Void. В более мягкой форме: LOL.


--------------------
user posted image
PM MAIL WWW   Вверх
Djuffin
Дата 22.10.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

Репутация: 1
Всего: 2



Цитата(Void @ 22.10.2006,  18:23)
Цитата(Djuffin @  22.10.2006,  20:14 Найти цитируемый пост)
Я не советую использовать vector<vector<>>. Это очень полохая практика.
Лучше vector<vector<>*>.

ROTFL.
Извиняюсь.

В чем я не прав?

Представляете что происходит каждый раз когда верхний вектор перераспределяет память, для добавления нового элемента?

Это сообщение отредактировал(а) Djuffin - 22.10.2006, 19:18
PM MAIL   Вверх
Void
Дата 22.10.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Djuffin @  22.10.2006,  21:02 Найти цитируемый пост)
Представляете что происходит каждый раз когда верхний вектор перераспределяет память, для добавления нового элемента?

Вполне. А вы? Hint: sizeof(vector<T>).


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Djuffin
Дата 22.10.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

Репутация: 1
Всего: 2



Цитата(Void @  22.10.2006,  19:22 Найти цитируемый пост)
Вполне. А вы? Hint: sizeof(vector<T>).

При чем здесь размер? 
Разве копирующий конструктор для каждого элемента (в данном случае каждого вложенного вектора) вызываться не будет?
Разве не будет проходить перераспределение памяти для каждого из воложенных векторов?

PM MAIL   Вверх
Void
Дата 22.10.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Djuffin @  22.10.2006,  21:47 Найти цитируемый пост)
При чем здесь размер? 

При том, что отличие вектора от указателя на вектор с т.з. оверхеда на выделение и перевыделение памяти минимальное.
Цитата(Djuffin @  22.10.2006,  21:47 Найти цитируемый пост)
Разве не будет проходить перераспределение памяти для каждого из воложенных векторов?

Т.е. вы хотите сказать, что
Код
vector<vector<int> > m(10, vector<int>(10));
m[0].push_back(0); // вот здесь начнёт перевыделяться память для остальных девяти векторов?

С чего вдруг?

Добавлено @ 19:55 
mr.DUDA, отдели пожалуйста ветку в cpp.general.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.DUDA
Дата 22.10.2006, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Модератор: вынес тему из C#


--------------------
user posted image
PM MAIL WWW   Вверх
Djuffin
Дата 23.10.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

Репутация: 1
Всего: 2



Код

m[0].push_back(0); // вот здесь начнёт перевыделяться память для остальных девяти векторов?

Цитата(Void @  22.10.2006,  19:54 Найти цитируемый пост)
С чего вдруг?

Нет. Вот здесь. 
Код

m.push_back(vector<int>(10))

PM MAIL   Вверх
Void
Дата 23.10.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Djuffin @  23.10.2006,  02:26 Найти цитируемый пост)
Вот здесь. 
    
m.push_back(vector<int>(10))

Аналогично. Каким образом это затрагивает память, выделенную под содержимое остальных векторов?
Хотя, должен признаться, это implementation defined. Но разумная реализация копиктора и swap таких вещей делать не должна.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Djuffin
Дата 23.10.2006, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

Репутация: 1
Всего: 2



Цитата(Void @  23.10.2006,  00:51 Найти цитируемый пост)
Хотя, должен признаться, это implementation defined. Но разумная реализация копиктора и swap таких вещей делать не должна.


ВОТ! Золотые твои слова smile

Проведем расследование.

Код

#include <vector>
#include <iostream>

using namespace std;

class Entity
{

public:
    static int copy;
    static int construct;
    static int destroy;

    Entity()
    {
        construct++;
    }

    Entity(const Entity &e)
    {
        copy++;
    }

    ~Entity()
    {
        destroy++;
    }
};

int Entity::copy = 0;
int Entity::construct = 0;
int Entity::destroy = 0;

int copy_before_add;
int construct_before_add;
int destroy_before_add;

void test()
{
    vector<vector<Entity> > m(4, vector<Entity>(10));
    vector<Entity> v(1);

    copy_before_add = Entity::copy;
    construct_before_add = Entity::construct;
    destroy_before_add = Entity::destroy;
    
    m.push_back(v);
}

int main(int argc, char* argv[])
{
    test();
    cout << "copy: " << Entity::copy << endl; 
    cout << "construct: " << Entity::construct << endl;
    cout << "destroy: " << Entity::destroy << endl;

    cout << "copy_before_add: " << copy_before_add << endl; 
    cout << "construct_before_add: " << construct_before_add << endl;
    cout << "destroy_before_add: " << destroy_before_add << endl;

    cout << "COPY OVERHEAD: " << Entity::copy - copy_before_add - 1 << endl;
    return 0;
}


Результаты.

Тут есть overhead.
Код

Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
Turbo Incremental Link 5.64 Copyright (c) 1997-2002 Borland


Код

copy: 92
construct: 2
destroy: 94
copy_before_add: 51
construct_before_add: 2
destroy_before_add: 12
COPY OVERHEAD: 40


А тут нету.

Код

Microsoft® C/C++ Compiler Driver 8.00.50727.42


Код

copy: 53
construct: 2
destroy: 55
copy_before_add: 51
construct_before_add: 2
destroy_before_add: 12
COPY OVERHEAD: 1


ВЫВОДЫ: (которые я для себя сделал)
0. Когда имеешь дело с STL надо хорошо обдумывать каждую строку кода.
1. Я отстал от современных реализаций STL.
2. На ROTFL мое замечание не тянет. smile




PM MAIL   Вверх
Dude03
Дата 23.10.2006, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Цитата(Void @ 22.10.2006,  19:22)
Цитата(Djuffin @  22.10.2006,  21:02 Найти цитируемый пост)
Представляете что происходит каждый раз когда верхний вектор перераспределяет память, для добавления нового элемента?

Вполне. А вы? Hint: sizeof(vector<T>).

лол, если автор поста хотел пошутить, то посмеялся, а если нет - плакать надо smile 
PM MAIL   Вверх
Daevaorn
Дата 23.10.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Djuffin @  22.10.2006,  19:14 Найти цитируемый пост)
Лучше vector<vector<>*>. 

Нет, ну давайте быть откровенными до конца, что это тоже не выход.
Код

std::vector< boost::shared_ptr< std::vector< T > > >

PM MAIL WWW   Вверх
mr.DUDA
Дата 23.10.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



В мелкомягкой реализации вектор содержит массив указателей на объекты, а не сами объекты. Поэтому алгоритм copy всего лишь скопирует N указателей при расширении массива (когда capacity не хватает).


--------------------
user posted image
PM MAIL WWW   Вверх
Daevaorn
Дата 23.10.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(mr.DUDA @  23.10.2006,  10:13 Найти цитируемый пост)
В мелкомягкой реализации вектор содержит массив указателей на объекты, а не сами объекты.

Это в какой?
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.