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 ] Правильное ли поведение?
От: Шура Ренийский Украина  
Дата: 18.10.05 14:05
Оценка: 1 (1)
Здравствуйте, Bell, Вы писали:

до кучи, интервальное присваивание:
PointList.assign(PointVector.begin(),PointVector.end());
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)
...

"Что не завершено, не сделано вовсе" Гаусс
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> — уже нет.
Любите книгу — источник знаний (с) М.Горький
[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[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: [STL ] Правильное ли поведение?
От: Mr.ToNik Россия http://sinstr.ru
Дата: 18.10.05 14:20
Оценка:
Всем большое спасибо, иду курить книгу...
Сделать человеку приятное очень просто. Не сделайте ему гадость и ему будет приятно!
Баг — это клоп. Таpакан — это, видимо, фича.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.