Форум программистов, компьютерный форум CyberForum.ru

std::move() - C++

Восстановить пароль Регистрация
 
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
23.02.2014, 22:25     std::move() #1
Есть ли разница между следующими вещами:

C++
1
2
3
4
A = std::move(B);
// and
std::copy(B.begin(), B.end(), A.begin());
B.clear();
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.02.2014, 22:36     std::move() #2
Если A и B это std::vector разного размера, то разница точно есть.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
23.02.2014, 22:42  [ТС]     std::move() #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Если A и B это std::vector разного размера, то разница точно есть.
A можно по подробнее?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.02.2014, 22:45     std::move() #4
Цитата Сообщение от mat_for_c Посмотреть сообщение
A можно по подробнее?
std::copy() не расширяет размер приемника. Нужно указывать например std::back_inserter() в качестве третьего параметра.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
23.02.2014, 22:52  [ТС]     std::move() #5
Цитата Сообщение от Tulosba Посмотреть сообщение
std::back_inserter() в качестве третьего параметра
согласен...
так все же, перемещение оно задействует копирование или нет?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.02.2014, 22:59     std::move() #6
mat_for_c, с точки зрения результата - кол-во элементов и их значения, разницы не будет (при оговоренном ранее условии). С точки зрения эффективности - лучше перемещение.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
23.02.2014, 23:04  [ТС]     std::move() #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// move example
#include <utility>      // std::move
#include <iostream>     // std::cout
#include <vector>       // std::vector
#include <string>       // std::string
 
int main () {
  std::string foo = "foo-string";
  std::string bar = "bar-string";
  std::vector<std::string> myvector;
 
  myvector.push_back (foo);                    // copies
  myvector.push_back (std::move(bar));         // moves
 
  std::cout << "myvector contains:";
  for (std::string& x:myvector) std::cout << ' ' << x;
  std::cout << '\n';
 
  return 0;
}
вот тут в 16 строчке x получается что-то наподобие итератора, который сам определил диапазон?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.02.2014, 23:09     std::move() #8
Цитата Сообщение от mat_for_c Посмотреть сообщение
вот тут в 16 строчке x получается что-то наподобие итератора, который сам определил диапазон?
x последовательно принимает значения от std::begin(myvector) до std::end(myvector). См. диапазонный (range) for.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2014, 23:25     std::move()
Еще ссылки по теме:

C++ Vector::swap и std::move - что эффективнее?
Std::move C++
Error: 'move' is not a member of 'std' C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
grindaah
20 / 20 / 0
Регистрация: 25.05.2011
Сообщений: 62
23.02.2014, 23:25     std::move() #9
move почти наверняка не задействует копирование.

Разница в приведенном коде может быть только для многопоточного приложения, т.к. для move
Data races
The objects in both ranges are modified.

а для copy:
Data races
The objects in the range [first,last) are accessed (each object is accessed exactly once).
The objects in the range between result and the returned value are modified (each object is modified exactly once).
Yandex
Объявления
23.02.2014, 23:25     std::move()
Ответ Создать тему
Опции темы

Текущее время: 00:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru