无法使用迭代器擦除矢量元素,矢量元素实现移动构造函数
Not able to erase vector element using iterator, vector element implements the move constructor
我有一个结构缓存的向量。实现 Move 构造函数的缓存。每当我尝试迭代这个向量并尝试在特定条件下擦除元素时,它都无法编译。
struct Cache {
Cache() {}
Cache(Cache&& other)
: serviceName(std::move(other.serviceName))
{}
~Cache() {}
size_t referenceCount;
std::string serviceName;
};
std::vector<Cache> vectorCaches;
auto iter = vectorCaches.begin();
while(iter != vectorCaches.end()) {
if(iter->serviceName == "Sample") {
iter = vectorCaches.erase(iter); //compiler error here
} else {
iter++;
}
}
编译器错误:
错误:使用已删除的函数"Cache&Cache::operator=(const Cache&)" __result = std::move(__first); ^ 注意:"Cache& Cache::operator=(const Cache&)"被隐式声明为已删除,因为"Cache"声明了一个移动 构造函数或移动赋值运算符 结构缓存 {
当矢量元素实现移动构造函数时,是否有任何解决方法可以实现擦除?任何帮助,不胜感激。
通过创建移动构造函数而不是复制构造函数,您已经使类型不可复制。
这很好,但是向量要求可以在其存储空间中复制或移动元素,特别是当您从容器中删除并且必须将以下所有元素打乱时。它通过分配来执行此操作。
因此,您可以保持类可移动和不可复制,但确实需要编写移动赋值运算符。
通常:如果编写复制构造函数,请编写复制赋值运算符;如果编写移动构造函数,请编写移动赋值运算符。
顺便说一下,你的循环被破坏了;如果服务名称不匹配,它不会通过容器。
删除此代码:
Cache(Cache&& other)
: serviceName(std::move(other.serviceName))
{}
它没有任何好的目的。 它甚至看起来有缺陷,如果不是越野车,也非常令人惊讶。
替换为:
Cache(Cache&& other)=default;
Cache(Cache const& other)=default;
Cache& operator=(Cache&& other)=default;
Cache& operator=(Cache const& other)=default;
或者,在某些情况下,省略所有 4 个。 我喜欢将它们显式默认。
编译器错误是因为创建Cache(Cache&&)
隐式删除了上面的其他成员函数,特别是vector.erase
使用的operator=(Cache&&)
。
相关文章:
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 如何正确实现容器类中元素的更改?
- 如何实现唯一 id 队列,其中元素可以在 C++ 中"bumped"到顶部?
- 如何实现四个 i8 元素组的高效_mm256_madd_epi8点积
- C++二叉搜索树实现不会添加每个元素
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- std::unordered_map如何存储和比较其密钥,以实现无需订购即可快速访问元素?
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- 为什么用于阈值矩阵元素的 Matlab 逻辑索引操作在性能上优于 mex 实现?
- 内部源代码 - 在链接列表实现中插入元素上的删除会破坏整个应用程序
- 在C 中,可以用语法[i,j,..]实现访问数组元素的功能,而语法就像numpy中的ndarray样式一样
- 试图用c++编写我自己的链表实现,在点击列表中的3个元素后编写segfault代码
- 无法使用迭代器擦除矢量元素,矢量元素实现移动构造函数
- 如何实现数据结构,就像C 中的数组一样支持不同的类型元素
- std::tuple的实现是否允许在触发空类元素的派生到基转换时失败
- 实现类型类向量的元素
- 如何使用 CUDA 正确实现每个元素上的执行函数
- 我如何实现 N 选择 K,允许元素重复,并对具有重复元素的输出进行低优先级
- 在Haskell中使用O(1)元素访问实现高效的类似拉链的数据结构
- 为容器的元素实现一个模板函数,总和为C++