[STL ] Правильное ли поведение?
От: Mr.ToNik Россия http://sinstr.ru
Дата: 18.10.05 13:32
Оценка:
VC 7.0

Есть:
std::vector <CPoint> PointVector;
std::list <CPoint> PointList;

если PointList.size() == 0 (только что создан), то
std::copy(PointVector.begin(), PointVector.end(),PointList.begin());

ничего не копирует. Приходится делать так:
PointList.resize(PointVector.size());
std::copy(PointVector.begin(), PointVector.end(),PointList.begin());

Это стандартное поведение? Должен ли вектор заботится о выделении дополнительной памяти?

Зарание спасибо!
Сделать человеку приятное очень просто. Не сделайте ему гадость и ему будет приятно!
Баг — это клоп. Таpакан — это, видимо, фича.
Re: [STL ] Правильное ли поведение?
От: Vamp Россия  
Дата: 18.10.05 13:36
Оценка:
Нет, это не стандартное поведедение. Это undefined. Компилятор сам память не выделяет. Используй вместо copy insert.
Да здравствует мыло душистое и веревка пушистая.
Re: [STL ] Правильное ли поведение?
От: Glоbus Украина  
Дата: 18.10.05 13:37
Оценка:
Здравствуйте, Mr.ToNik, Вы писали:

MT>VC 7.0


MT>Есть:

MT>
MT>std::vector <CPoint> PointVector;
MT>std::list <CPoint> PointList;
MT>

MT>если PointList.size() == 0 (только что создан), то
MT>
MT>std::copy(PointVector.begin(), PointVector.end(),PointList.begin());
MT>

MT>ничего не копирует. Приходится делать так:
MT>
MT>PointList.resize(PointVector.size());
MT>std::copy(PointVector.begin(), PointVector.end(),PointList.begin());
MT>

MT>Это стандартное поведение? Должен ли вектор заботится о выделении дополнительной памяти?

MT>Зарание спасибо!


Не должен. Потому что алгоритм std::copy принимает итераторы, и он не знает какие это итераторы — может это тоже лист, а может вектор, а может мап... То есть не зная тип контейнера std::copy никак не сможет распределить память. Но если ты не хочешь делать предварительно resize() воспользуйся std::inserter()/std::back_inserter() в зависимости от того, что тебе конкретно нужно.
Удачи тебе, браток!
Re: [STL ] Правильное ли поведение?
От: Аноним  
Дата: 18.10.05 13:38
Оценка:
Здравствуйте, Mr.ToNik, Вы писали:

MT>VC 7.0


MT>Есть:

MT>
MT>std::vector <CPoint> PointVector;
MT>std::list <CPoint> PointList;
MT>

MT>если PointList.size() == 0 (только что создан), то
MT>
MT>std::copy(PointVector.begin(), PointVector.end(),PointList.begin());
MT>

MT>ничего не копирует. Приходится делать так:
MT>
MT>PointList.resize(PointVector.size());
MT>std::copy(PointVector.begin(), PointVector.end(),PointList.begin());
MT>

MT>Это стандартное поведение? Должен ли вектор заботится о выделении дополнительной памяти?

Во-первых, приведенный тобой код не скомпилится, так как у списка нет функции resize. Во-вторых, когда ты копируешь что-то при помощи std::copy, то в контейнере, в который ты копируешь, должно быть достаточно места, иначе получаешь неопределенное поведение. Если ты не можешь делать resize (как в твоем случае), то можно использовать std::back_inserter(yourContainer) как последний аргумент для std::copy
Re[2]: [STL ] Правильное ли поведение?
От: Аноним  
Дата: 18.10.05 13:42
Оценка:
А>Во-первых, приведенный тобой код не скомпилится, так как у списка нет функции resize.

Прошу прощения, есть resize.
Re: [STL ] Правильное ли поведение?
От: Bell Россия  
Дата: 18.10.05 13:53
Оценка: 2 (1)
Здравствуйте, Mr.ToNik, Вы писали:

MT>VC 7.0


MT>Есть:

MT>
MT>std::vector <CPoint> PointVector;
MT>std::list <CPoint> PointList;
MT>

MT>если PointList.size() == 0 (только что создан), то
MT>
MT>std::copy(PointVector.begin(), PointVector.end(),PointList.begin());
MT>

MT>ничего не копирует.
И правильно делает . Так что либо заранее выделяй память, как в твоем втором варианте, либо используй, к примеру, back_inserter:
std::copy(PointVector.begin(), PointVector.end(),std::back_inserter(PointList));

либо используй конструктор:
std::list <CPoint> PointList2(PointVector.begin(), PointVector.end());

либо интервальный insert:
PointList.insert(PointList.begin(), PointVector.begin(), PointVector.end());
Любите книгу — источник знаний (с) М.Горький
Re[2]: [STL ] Правильное ли поведение?
От: Lorenzo_LAMAS  
Дата: 18.10.05 14:00
Оценка:
B>либо используй конструктор:
B>
B>std::list <CPoint> PointList2(PointVector.begin(), PointVector.end());
B>

B>либо интервальный insert:
B>
B>PointList.insert(PointList.begin(), PointVector.begin(), PointVector.end());
B>


Надо думать, со старым динкумваре стл это не сработает?
Of course, the code must be complete enough to compile and link.
Re[2]: [STL ] Правильное ли поведение?
От: Шура Ренийский Украина  
Дата: 18.10.05 14:05
Оценка: 1 (1)
Здравствуйте, Bell, Вы писали:

до кучи, интервальное присваивание:
PointList.assign(PointVector.begin(),PointVector.end());
Re[3]: [STL ] Правильное ли поведение?
От: Bell Россия  
Дата: 18.10.05 14:11
Оценка: +1
Здравствуйте, Lorenzo_LAMAS, Вы писали:

B>>либо используй конструктор:

B>>
B>>std::list <CPoint> PointList2(PointVector.begin(), PointVector.end());
B>>

B>>либо интервальный insert:
B>>
B>>PointList.insert(PointList.begin(), PointVector.begin(), PointVector.end());
B>>


L_L>Надо думать, со старым динкумваре стл это не сработает?

Именно вот этот пример, т.е. из "однотипного" вектора в список — сработает, а вот наоборот, или даже из vector<short> в list<long> — уже нет.
Любите книгу — источник знаний (с) М.Горький
Re: [STL ] Правильное ли поведение?
От: Mr.ToNik Россия http://sinstr.ru
Дата: 18.10.05 14:20
Оценка:
Всем большое спасибо, иду курить книгу...
Сделать человеку приятное очень просто. Не сделайте ему гадость и ему будет приятно!
Баг — это клоп. Таpакан — это, видимо, фича.
Re[2]: [STL ] Правильное ли поведение?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 18.10.05 14:57
Оценка: 1 (1)
Здравствуйте, Mr.ToNik, Вы писали:

MT>Всем большое спасибо, иду курить книгу...



Джосьютис Н. C++ Стандартная библиотека.
Автор(ы): Джосьютис Н.

Книга посвящена стандартной библиотеке C++, значительно расширяющей
возможности базового языка. Особое внимание уделяется стандартной
библиотеке шаблонов STL — ее многочисленным контейнерам, итераторам,
объектам функций и алгоритмам. Также подробно описана библиотека
потокового ввода/вывода IOStream и другие компоненты стандартной
библиотеки C++: специализированные контейнеры, строки, поддержка
математических вычислений, проблемы интернационализации и т.д. Кроме
подробной документации по всем классам и интерфейсам библиотеки, в
книге также разъясняются многие нетривиальные концепции, а также
рассматриваются практические аспекты программирования, необходимые для
эффективного использования стандартной библиотеки, и типичные ошибки.
Материал поясняется многочисленными примерами. Книга может
использоваться и как учебник, и как справочник. Книга рассчитана на
программистов среднего и высокого уровня.


9.6.1 Copying Elements
OutputIterator
copy (InputIterator sourceBeg, InputIterator sourceEnd, OutputIterator destBeg)
...

"Что не завершено, не сделано вовсе" Гаусс
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.