std::copy()
От: Valus Россия  
Дата: 09.10.05 19:33
Оценка:
Есть ли возможность сделать быстрое std::copy(), т.е. <O(N)
из deque в vector
или из list в vector
???
Re: std::copy()
От: _Winnie Россия C++.freerun
Дата: 09.10.05 20:39
Оценка:
Здравствуйте, Valus, Вы писали:

V>Есть ли возможность сделать быстрое std::copy(), т.е. <O(N)

Нет, включи элементарную логику. Что бы присвоить N объектов, надо N присваивание ^_^
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: std::copy()
От: Valus Россия  
Дата: 09.10.05 21:28
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Нет, включи элементарную логику. Что бы присвоить N объектов, надо N присваивание ^_^

я просто гне так выразился...
что-то типа: не копирование, а перенос! Просто создавать нужно именно list, а дальше работать с vector. Можно ли быстро перенести данные?
Re[3]: std::copy()
От: Elich  
Дата: 10.10.05 06:16
Оценка: 1 (1)
_W>>Нет, включи элементарную логику. Что бы присвоить N объектов, надо N присваивание ^_^
V>я просто гне так выразился...
V>что-то типа: не копирование, а перенос! Просто создавать нужно именно list, а дальше работать с vector. Можно ли быстро перенести данные?

Нет. Список элементов (list) нельзя превратить в непрерывный блок памяти (vector) без копирования.
Re[4]: std::copy()
От: Valus Россия  
Дата: 10.10.05 21:07
Оценка:
Здравствуйте, Elich, Вы писали:

_W>>>Нет, включи элементарную логику. Что бы присвоить N объектов, надо N присваивание ^_^

V>>я просто гне так выразился...
V>>что-то типа: не копирование, а перенос! Просто создавать нужно именно list, а дальше работать с vector. Можно ли быстро перенести данные?

E>Нет. Список элементов (list) нельзя превратить в непрерывный блок памяти (vector) без копирования.

а что происходит с вектором, если
а) изначально он пуст
б) добавим push_back() N раз
в этом случае вектор увеличится и перестроится все N раз или как-то иначе, я росто что-то такое слышал, что не все N раз...?
Re[5]: std::copy()
От: GregZ СССР  
Дата: 11.10.05 06:25
Оценка: +1
Здравствуйте, Valus, Вы писали:

V> б) добавим push_back() N раз

V>в этом случае вектор увеличится и перестроится все N раз или как-то иначе, я росто что-то такое слышал, что не все N раз...?

При выделении нового блока памяти его размер будет кратен текущей емкости контейнера. В большинстве реализаций vector и string используется двухкратное увеличение, то есть при каждом выделении дополнительной памяти емкость контейнера увеличивается вдвое.
Re[5]: std::copy()
От: Elich  
Дата: 11.10.05 08:33
Оценка:
Здравствуйте, Valus, Вы писали:

E>>Нет. Список элементов (list) нельзя превратить в непрерывный блок памяти (vector) без копирования.


V>а что происходит с вектором, если

V> а) изначально он пуст
V> б) добавим push_back() N раз
V>в этом случае вектор увеличится и перестроится все N раз или как-то иначе, я росто что-то такое слышал, что не все N раз...?

В худшем случае произойдет перераспределение памяти N раз. Но на практике, как верно сказал GregZ, память при очередном перераспределеии добавляется "с запасом". То есть фактическое перераспределение произойдет менее N раз.

Если число элементов для вставки в вектор заранее известно, можно явно попросить вектор выделить нужное количество памяти для них — вызовом метода vector::reserve, таким образом вовсе избежав перераспределений памяти в процессе вставки элементов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.