Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > vector


Автор: Userman 11.7.2009, 17:22
Есть класс, содержащий вектор. Есть метод, который на основе этого вектора создаёт новый такого же размера, затем вектор, который является полем класса должен стать новым вектором.
Читал, что если надо присвоить один список другому, но присвоенный после этого не нужен, то подойдёт std::swap.
Можно ли как-нибудь объектам ветора поменять выделенные области памяти?
P.S. Решение использовать указатель на вектор а не вектор я вижу.

Автор: Lazin 11.7.2009, 17:25
Цитата(Userman @  11.7.2009,  17:22 Найти цитируемый пост)
Так же ли реализован swap для объектов вектора одинакового размера, или будет поэлементный обмен?

нет, просто указатели на данные векторов поменяются местами

Автор: Proger10 11.7.2009, 17:28
А вот интересно.. почему класс называется вектором, а означает фактически - массив данных? smile Вектор ведь всегда куда-то направлен, а куда направлен массив?

Автор: Userman 11.7.2009, 17:37
Цитата(Lazin @ 11.7.2009,  17:25)
Цитата(Userman @  11.7.2009,  17:22 Найти цитируемый пост)
Так же ли реализован swap для объектов вектора одинакового размера, или будет поэлементный обмен?

нет, просто указатели на данные векторов поменяются местами

Значит поэлементного обмена не будет? И вектор-поле станет новым вектором очень быстро независимо от размера?
Происходит проверка на то совпадают ли размеры и если совпадает, тогда меняются указатели на данные?

Автор: zim22 11.7.2009, 17:39
Цитата(Proger10 @  11.7.2009,  17:28 Найти цитируемый пост)
 Вектор ведь всегда куда-то направлен, а куда направлен массив?

в небеса.
***
математическая абстракция "вектор" в С++ реализована посредством класса std::valarray

Автор: mes 11.7.2009, 17:53
Цитата(Userman @  11.7.2009,  16:37 Найти цитируемый пост)
Происходит проверка на то совпадают ли размеры и если совпадает, тогда меняются указатели на данные? 

а зачем проверять ? у одного вектора размер 1 байт у другого миллиард, поменяли указатели на области, теперь миллиард принадлежит первому, а один байт второму вектору.
smile 
P.S. Естественно, помимо значений указателей на блок данных, меняется и переменная размер..



Автор: Userman 11.7.2009, 17:57
ясно, спасибо

Автор: mes 11.7.2009, 18:01
Цитата(Proger10 @  11.7.2009,  16:28 Найти цитируемый пост)
А вот интересно.. почему класс называется вектором, а означает фактически - массив данных?

В линейной алгебре, вектор это элемент линейного пространства. Обычно вводится понятие базиса, и тогда вектор становится возможным представить в виде линейной комбинации — разложении по базису:

http://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

Автор: Userman 11.7.2009, 21:38
Код

vector<T> f1()
{
    vector<T> v;
    //...
    return v;
}

void f2(vector<T> *v)
{
    //...
}

Сильно ли отличается по времени выполнения
Код

vector<T> x = f1()

от
Код

vector<T> x;
f2(&x);

Автор: azesmcar 11.7.2009, 21:40
Цитата(Userman @  11.7.2009,  21:38 Найти цитируемый пост)
Сильно ли отличается по времени выполнения

Если оптимизация включена - нет.
Прочитай про http://www.efnetcpp.org/wiki/Return_value_optimization

Но мое мнение - лучше не писать код зависящий от оптимизатора.

Автор: Userman 11.7.2009, 22:00
А объект возвращаемый функцией копирует то, что записано в return, или пока происходит работа с возвращённым значением, локальный объект функции, который возвращается, живёт?
сравним ли по скорости выполнения
Код

vector<T> x;
swap(x, f1());

с
Код

vector<T> x;
f2(&x);
?
P.S А ещё вопрос по поводу включенности оптимизатора. Если он выключен будет ли for(int i=0; i<n; i++) работать медленнее, чем for(int i=0; <n; ++i) ?

Автор: azesmcar 11.7.2009, 22:11
Эта тема уже раз 100 обсуждалась.

http://forum.vingrad.ru/forum/topic-229478/hl/rvo/0.html#st_0_view_0

Автор: andrew_121 11.7.2009, 22:39
Прошу прощения за оффтоп.

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

п.с.
вопрос из области философии?

Автор: mes 11.7.2009, 23:33
andrew_121, Имхо, потому что одни стараются решить свои проблемы сами, пользуясь документацией и гуглем, a  другие хотят, чтоб  за них разжевали smile

Автор: Userman 11.7.2009, 23:45
не только поэтому, мне, например, надо разобраться как сделать, чтобы это быстро работало, но сейчас нет времени на то, чтобы читать всё подряд пока не найду ответ на свой вопрос. И в поисковик неизвестно что вписать. "Как быстро присвоить одному вектору другой, когда другой не нужен?"

Автор: Lazin 12.7.2009, 00:05
Цитата(andrew_121 @  11.7.2009,  22:39 Найти цитируемый пост)
Почему так?
просто есть люди, которые осваивают небольшое подмножество языка, несколько библиотек, успокаиваются на этом и начинают
Цитата(andrew_121 @  11.7.2009,  22:39 Найти цитируемый пост)
прогить годам

а другой человек, не успокоится, пока не будет хорошо знать то, чем занимается...
такие дела smile 

Автор: andrew_121 12.7.2009, 00:23
Lazin, опять сарказм

Автор: Lazin 12.7.2009, 09:01
andrew_121, я не имел ввиду конкретного человека, просто видел такое не раз...

Автор: mes 12.7.2009, 10:44
Цитата(Userman @  11.7.2009,  22:45 Найти цитируемый пост)
но сейчас нет времени на то, чтобы читать всё подряд пока не найду ответ на свой вопрос. 

а все подряд и не надо, надо для началa просто прочитать документацию по вектору,:
http://www.cplusplus.com/reference/stl/vector/swap/ 

при том там всего 3  предложения, так что на нехватку времени для чтения грех жаловаться.

Вот в цитате выделил ответы на Ваши вопросы .
Цитата

Exchanges the content of the vector by the content of vec, which is another vector of the same type. [B]Sizes may differ.(*1)
After the call to this member function, the elements in this container are those which were in vec before the call, and the elements of vec are those which were in this.(*2) All iterators, references and pointers remain valid for the swapped vectors.(*3)

Notice that a global algorithm function exists with this same name, swap, and the same behavior.
[/B]


Цитата(Userman @  11.7.2009,  16:22 Найти цитируемый пост)
Можно ли как-нибудь объектам ветора поменять выделенные области памяти?

(*2), (*3)  //  раз итераторы остаются валидными значит просто происходет обмен владениями.

Цитата(Userman @  11.7.2009,  16:37 Найти цитируемый пост)
Происходит проверка на то совпадают ли размеры и если совпадает, тогда меняются указатели на данные? 

(*1)

Цитата(andrew_121 @  11.7.2009,  21:39 Найти цитируемый пост)
Почему человек может прогить годами, и определенные вопросы так и некогда не задает

под этим, я так понимаю подразумевались те вопросы которые тысячу раз разжеваны в документации.
Вот если бы Вы заглянули бы туда и прочитав не до конца уверены были бы, что правильно поняли назначение, то тогда прямая дорога на форум.
smile

Приятно помогать такому человеку, который сам старается найти ответ на вопрос, а не просто хочет получить готовое.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)