std :: vector :: erase(item)需要为项目定义的分配操作员

std::vector::erase(item) needs assignment operator to be defined for item?

本文关键字:项目 定义 分配 操作员 erase vector item std      更新时间:2023-10-16

我有一个不定定义 operator=的类C。我正在尝试使用这样的向量:std::vector<std::pair<C,D>> vec;。现在,我的问题是我完成后无法删除这对。编译器抱怨C缺少operator=。我可以没有一个没有该操作员的班级的向量吗?我该如何解决?我无法将分配添加到C。这是我遇到的错误:

error C2582: 'operator =' function is unavailable in 'C'    C:...includeutility  196 1   my-lib

这是我的代码:

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++;
    }
 }

其中 cs_是:

std::vector<std::pair<C,D>> cs_;

原因是,如果擦除与std::vector::end()不同的位置,则擦除将重新分配您的对象。重新分配的含义是复制。

请注意,不可复制类型的向量仅部分可用。在我们拥有emplace()(PRE-C 11)之前,这甚至是不可能的。如果您的班级可复制,为什么不定义作业操作员?

解决方法可以是smartpointers(或普通指针)的向量,例如 std::vector<std::unique_ptr<C>>

是正确的。该标准要求向量或Deque中的项目 emaveAssignable 如果erase工作。

通常,向量和脱口机需要能够从任意位置擦除。当他们这样做时,他们需要能够将剩余的任何物品转移到被擦除的物品腾出的空间中。该标准说(无论如何,无论如何,通过其 moveAssignable 要求erase上的要求),他们通过分配来做到这一点,因此包含的项目需要分配运算符。另一个选项可以像复制构造函数一样复制项目,但这不是完成的方式。