std :: vector :: erase(item)是否需要为item定义赋值运算符?

341*_*008 7 c++ operators stdvector visual-studio-2012

我有一个C没有定义的类operator=.我试图使用这样的矢量:std::vector<std::pair<C,D>> vec;.现在,我的问题是,在我完成它之后,我无法擦掉它.编译器会抱怨缺少operator=C.我可以没有没有此运算符的类的向量吗?我该如何解决这个问题?我无法添加作业C.这是我得到的错误:

error C2582: 'operator =' function is unavailable in 'C'    C:\...\include\utility  196 1   my-lib
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

void Remove(const C& c) 
{
    auto i = cs_.begin();
    while( i != cs_.end()) {
        if (i->first == c) {
            cs_.erase(i);  // this is the problem
            break;
        }
        i++;
    }
 }
Run Code Online (Sandbox Code Playgroud)

在哪里cs_:

std::vector<std::pair<C,D>> cs_;
Run Code Online (Sandbox Code Playgroud)

Seb*_*ann 5

原因是如果擦除不同的位置,擦除将重新分配您的对象std::vector::end().重新分配意味着复制.

请注意,不可复制类型的矢量只能部分使用.在我们emplace()(C++之前的11版)之前,它甚至是不可能的.如果您的类是可复制的,那么为什么不定义赋值运算符呢?

解决方法可能是智能指针(或普通指针)的矢量 std::vector<std::unique_ptr<C>>