Модераторы: 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   Вверх
mr.DUDA
Дата 23.10.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Daevaorn @  23.10.2006,  09:25 Найти цитируемый пост)
Это в какой?

Visual Studio N \ VC \ include \ vector

З.Ы. а что, разные бывают что ли ?  smile 


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Насколько я читал, STL по определению реализует семантику значений, а не указателей. Поэтому если я копирую вектор, то мне же нужно скопировать значения из вектора, а не указатели на них!

Это, по-моему, описано в стандарте. В этом случае мелкомягкие .... <ваша фантазия>  smile 

Но я себе это плохо представляю...


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


mr.DUDA, ты уверен в этом?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Void
Дата 23.10.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Цитата(Djuffin @  23.10.2006,  03:09 Найти цитируемый пост)
0. Когда имеешь дело с STL надо хорошо обдумывать каждую строку кода.
1. Я отстал от современных реализаций STL.
2. На ROTFL мое замечание не тянет.

+++
Погорячился smile


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


Эксперт
****


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

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



Цитата(mr.DUDA @  23.10.2006,  11:18 Найти цитируемый пост)
Visual Studio N \ VC \ include \ vector

З.Ы. а что, разные бывают что ли ?    

Представь себе да.
Цитата(JackYF @  23.10.2006,  16:49 Найти цитируемый пост)
Это, по-моему, описано в стандарте. В этом случае мелкомягкие .... <ваша фантазия>   

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


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


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

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



Цитата(JackYF @  23.10.2006,  15:49 Найти цитируемый пост)
mr.DUDA, ты уверен в этом?

Насколько я смог понять, да. 
Значения лежат в классе-обёртке _Alloc, которая в свою очередь лежит в векторе. Если я не прав, ногами не пинайте, я смотрю что тут сишники собрались хардкорные.

Цитата(Daevaorn @  23.10.2006,  17:54 Найти цитируемый пост)
Представь себе да.

Хм, пример ?


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Во-первых, _Alloc зависит от реализации.
У него даже не факт, что имя такое...

Во-вторых, контейнеры STL реализуют семантику значений, и по сему указатели там хранится в принципе не могут. Кроме того, для контейнера std::vector гарантируется, что элементы будут лежать рядом, и к элементам вектора можно обращаться как к обычному массиву.

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

Если нужно хранить указатели на элементы - пожалуйста, храните объекты T*, кто запрещает?..

Примеры реализаций:
STLport
Dinkumware Standart C++ Library
Microsoft - ...
GNU - ...

Это навскидку, а есть еще и другие...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Daevaorn
Дата 23.10.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mr.DUDA @  23.10.2006,  20:01 Найти цитируемый пост)
Насколько я смог понять, да. 

Не верно понял.
Цитата(mr.DUDA @  23.10.2006,  20:01 Найти цитируемый пост)
Значения лежат в классе-обёртке _Alloc, которая в свою очередь лежит в векторе

И какой ты вывод сделал?
Цитата(mr.DUDA @  23.10.2006,  20:01 Найти цитируемый пост)
Хм, пример ? 

У каждой версии студии своя реализия. База общая, это реализация от Dinkware, но от версии к версии отличия очень существенны.

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


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


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

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



Цитата(Daevaorn @  23.10.2006,  19:21 Найти цитируемый пост)
Не верно понял.

Вполне возможно

Цитата(Daevaorn @  23.10.2006,  19:21 Найти цитируемый пост)
И какой ты вывод сделал?

Неверный вывод о том, что обёртка содержит указатель, который и копируется в copy constructor

Цитата(Daevaorn @  23.10.2006,  19:21 Найти цитируемый пост)
У каждой версии студии своя реализия. База общая, это реализация от Dinkware, но от версии к версии отличия очень существенны.

+1
маньяк !  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1150 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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