Mic*_*ell 5 c++ swap const vector c++11
我有以下代码
class a {
public:
const int aa;
a(int aa) : aa(aa){}
};
int main() {
std::vector<a> v;
v.emplace_back(1);
v.emplace_back(2);
v.emplace_back(3);
v.emplace_back(4);
std::iter_swap(v.begin() + 1, v.rbegin());
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试交换向量的两个元素时,我收到错误.
Error C2280 'a &a::operator =(const a &)': attempting to reference a deleted function
Run Code Online (Sandbox Code Playgroud)
我理解这是因为a有一个不变的成员,但我无法弄清楚如何使这个工作.
dor*_*ron 11
问题是swap改变现有元素的价值.由于元素是const,因此无法更改它们因此编译器错误.
如果你坚持使用const元素,你的向量应该是vector<a*>或者事件更好vector<unique_ptr<a>>.这将允许您交换元素而不会改变实际的元素a
基于此线程以下工作:
#include <vector>
#include <iostream>
class Foo {
public:
const int value;
Foo(const int &&from) : value(std::move(from)){}
Foo(const Foo &&other) : value(std::move(other.value)){}
Foo & operator=(Foo && source) {
this -> ~ Foo ();
new (this) Foo(std::move(source));
return *this;
}
};
int main() {
std::vector<Foo> v;
v.emplace_back(1);
v.emplace_back(2);
v.emplace_back(3);
v.emplace_back(4);
std::cout << (v.begin() + 1)->value << "," <<v.rbegin()->value << std::endl;
std::iter_swap(v.begin() + 1, v.rbegin());
std::cout << (v.begin() + 1)->value << "," <<v.rbegin()->value << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1586 次 |
| 最近记录: |