vector - 当元素具有const成员时交换两个元素

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


j2k*_*2ko 2

基于线程以下工作:

#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)