Код
using namespace std;
class A
{
private:
vector<int> a;
public:
A(vector<int> x):a(x){}
string toString()
{
string s;
for (auto& element : a)
{
s += to_string(element) + " ";
}
return s;
}
};
int main()
{
A a1({1,2,3});
A a2({11,12,13});
cout << "a1 = " << a1.toString() << "\n";
cout << "a2 = " << a2.toString() << "\n";
swap(a1,a2);
cout << "a1 = " << a1.toString() << "\n";
cout << "a2 = " << a2.toString() << "\n";
return 0;
}
результаты, как и ожидалось
a1 = 1 2 3
a2 = 11 12 13
a1 = 11 12 13
a2 = 1 2 3
Из cplusplus.com › std::swap в разделе сложность
Не массив: константа: выполняет ровно одно построение и два присваивания (хотя обратите внимание, что каждая из этих операций работает со своей собственной сложностью).
Массив: линейный по N: выполняет операцию замены для каждого элемента.
Означает ли это, что std::swap
при применении к a1
и a2
только меняет местами указатели на массивы [1,2,3]
и [11,12,13]
, но не копирует int
или что-то еще?
Что именно делает std::swap
при применении к двум объектам класса A
?
Предполагая, что std::swap
копирует все элементы массива, должен ли я написать функцию static A::swap
, используя vector::swap
, временная сложность которой постоянна (из cplusplus.com › vector::swap) означает, что он меняет местами только указатели?
[..] хочу добавить примечание о том, что семантика
std::swap
изменена в C++17. Поэтому было бы неплохо упомянуть компилятор, его версию и стандарт, на который вы ориентируетесь.
Я надеялся, что простой вопрос не вызовет сложностей со стандартами C++ и версиями компиляторов. Обычно я компилирую свой код на C++11. Для полноты вот версия gcc на моем ноутбуке.
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
std::swap
изменена в C ++17. Поэтому было бы неплохо упомянуть компилятор, его версию и стандарт, на который вы ориентируетесь. И то, о чем вы спрашиваете, напрямую зависит от этого семантического изменения в C++17. - person Some programmer dude   schedule 19.02.2018