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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mat_for_c
161 / 156 / 33
Регистрация: 26.04.2013
Сообщений: 704
Завершенные тесты: 2
#1

std::move() - C++

23.02.2014, 22:25. Просмотров 996. Ответов 8
Метки нет (Все метки)

Есть ли разница между следующими вещами:

C++
1
2
3
4
A = std::move(B);
// and
std::copy(B.begin(), B.end(), A.begin());
B.clear();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 22:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос std::move() (C++):

Std::move - C++
Добрый вечер, #include <iostream> using namespace std; class A { private: int x = 10; public: A(int q){ x = q; }

Optional и std::move - C++
добрый день. разбираясь в исходниках optional'а из gcc, я понял, что там нигде не делается инвалидным только что перемещенный объект. ...

std::move, rvalue reference - C++
Здравствуйте! Недавно начал разбираться с новыми способами передачи аргументов. Прочитал около 10 статей, некоторые на русском, некоторые...

Func(std::move(.) копирует ? - C++
Здравствуйте, имеется следующий код: void foo(std::vector<int>&& v) { std::cout << "vector is taken" << std::endl; ...

Немного не понимаю std::move - C++
Здравствуйте, я немного не понимаю работу кода на 150-155 строках здесь: #include <iostream> #include <memory> #include...

Std::move stl-алгоритм - C++
здравствуйте, есть такой код: std::string his = "what the work ?"; std::istringstream isg(his); ...

8
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 22:36 #2
Если A и B это std::vector разного размера, то разница точно есть.
0
mat_for_c
161 / 156 / 33
Регистрация: 26.04.2013
Сообщений: 704
Завершенные тесты: 2
23.02.2014, 22:42  [ТС] #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Если A и B это std::vector разного размера, то разница точно есть.
A можно по подробнее?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 22:45 #4
Цитата Сообщение от mat_for_c Посмотреть сообщение
A можно по подробнее?
std::copy() не расширяет размер приемника. Нужно указывать например std::back_inserter() в качестве третьего параметра.
0
mat_for_c
161 / 156 / 33
Регистрация: 26.04.2013
Сообщений: 704
Завершенные тесты: 2
23.02.2014, 22:52  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
std::back_inserter() в качестве третьего параметра
согласен...
так все же, перемещение оно задействует копирование или нет?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 22:59 #6
mat_for_c, с точки зрения результата - кол-во элементов и их значения, разницы не будет (при оговоренном ранее условии). С точки зрения эффективности - лучше перемещение.
1
mat_for_c
161 / 156 / 33
Регистрация: 26.04.2013
Сообщений: 704
Завершенные тесты: 2
23.02.2014, 23:04  [ТС] #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 получается что-то наподобие итератора, который сам определил диапазон?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 23:09 #8
Цитата Сообщение от mat_for_c Посмотреть сообщение
вот тут в 16 строчке x получается что-то наподобие итератора, который сам определил диапазон?
x последовательно принимает значения от std::begin(myvector) до std::end(myvector). См. диапазонный (range) for.
0
grindaah
20 / 20 / 0
Регистрация: 25.05.2011
Сообщений: 62
23.02.2014, 23:25 #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).
0
23.02.2014, 23:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2014, 23:25
Привет! Вот еще темы с ответами:

Error: 'move' is not a member of 'std' - C++
Как бороться с этой гогой?

Не срабатывает move конструктор std::unique_ptr - C++
Всем привет! Битый час не пойму почему в списке захвата компилятор ругается на удаленный копирующий конструктор unique_ptr, если я его...

Vector::swap и std::move - что эффективнее? - C++
Пусть имеется пустой вектор A и заполненный некими данными вектор B. Тогда какой из методов более эффективный: A.swap(B); A =...

Что происходит когда std::move применяется для int? - C++
Мне, вроде бы, понятно как работает std::move() на классах типа string. Но мне непонятно что будет в данном случаи. #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru