为向量擦除删除了隐式赋值运算符?
Implicit assignment operator deleted for vector erasing?
我有两个向量,我想比较它们并删除重复项。如果我有两个向量 vecA
和 vecB
,我想从 vecA
中删除出现在 vecB
中的元素。具体来说,我希望将 vecA
传递给一个方法并在该方法中进行变异。
#include <iostream>
#include <string>
#include <vector>
class M {
private:
const char COL[8] = {'a','b','c','d','e','f','g','h'};
public:
int aC, aR, dC, dR;
M(int a, int b, int c, int d) {
aC = a; aR = b; dC = c; dR = d;
}
bool operator==(M &m) {
bool sameC = (aC == m.aC && dC == m.dC);
bool sameR = (aR == m.aR && dR == m.dR);
return (sameC && sameR);
}
};
class B {
public:
std::vector<M> foo() {
std::vector<M> vec;
vec.push_back(M(1, 3, 2, 4));
vec.push_back(M(1, 2, 3, 4));
return vec;
}
};
class K {
public:
void boo(B* b) {
std::vector<M> vec;
vec.push_back(M(1, 2, 3, 4));
vec.push_back(M(2, 3, 4, 5));
std::cout << "Size before: " << vec.size() << "\n";
bar(b, vec);
std::cout << "Size after: " << vec.size() << "\n";
}
void bar(B* b, std::vector<M> &v) {
std::vector<M> vec = b->foo();
for (unsigned int i = 0; i < v.size(); i++) {
for (unsigned int j = 0; j < vec.size(); j++) {
if (v[i] == vec[j]) { v.erase(v.begin() + i); }
}
}
}
};
int main()
{
B* baz;
K var;
var.boo(baz);
}
我收到一个错误 M& operator=(const M&) is implicitly deleted because the default definition would be ill-formed
。
问题代码是const char
数组;删除这段代码,其他一切正常,但为什么呢?
此代码的预期输出为:
Size before: 2
Size after: 1
为什么迭代仍然需要赋值运算符(对于 erase
),是否有解决方法?在这种情况下,"default assignment operator" 是什么?
class M
有一个非静态成员变量 COL
是一个 const
的数组,所以编译器不能复制其中的内容阵列结束。
大概你打算制作 COL
static
,所以它不是每个 M
对象的子对象?
我有两个向量,我想比较它们并删除重复项。如果我有两个向量 vecA
和 vecB
,我想从 vecA
中删除出现在 vecB
中的元素。具体来说,我希望将 vecA
传递给一个方法并在该方法中进行变异。
#include <iostream>
#include <string>
#include <vector>
class M {
private:
const char COL[8] = {'a','b','c','d','e','f','g','h'};
public:
int aC, aR, dC, dR;
M(int a, int b, int c, int d) {
aC = a; aR = b; dC = c; dR = d;
}
bool operator==(M &m) {
bool sameC = (aC == m.aC && dC == m.dC);
bool sameR = (aR == m.aR && dR == m.dR);
return (sameC && sameR);
}
};
class B {
public:
std::vector<M> foo() {
std::vector<M> vec;
vec.push_back(M(1, 3, 2, 4));
vec.push_back(M(1, 2, 3, 4));
return vec;
}
};
class K {
public:
void boo(B* b) {
std::vector<M> vec;
vec.push_back(M(1, 2, 3, 4));
vec.push_back(M(2, 3, 4, 5));
std::cout << "Size before: " << vec.size() << "\n";
bar(b, vec);
std::cout << "Size after: " << vec.size() << "\n";
}
void bar(B* b, std::vector<M> &v) {
std::vector<M> vec = b->foo();
for (unsigned int i = 0; i < v.size(); i++) {
for (unsigned int j = 0; j < vec.size(); j++) {
if (v[i] == vec[j]) { v.erase(v.begin() + i); }
}
}
}
};
int main()
{
B* baz;
K var;
var.boo(baz);
}
我收到一个错误 M& operator=(const M&) is implicitly deleted because the default definition would be ill-formed
。
问题代码是const char
数组;删除这段代码,其他一切正常,但为什么呢?
此代码的预期输出为:
Size before: 2
Size after: 1
为什么迭代仍然需要赋值运算符(对于 erase
),是否有解决方法?在这种情况下,"default assignment operator" 是什么?
class M
有一个非静态成员变量 COL
是一个 const
的数组,所以编译器不能复制其中的内容阵列结束。
大概你打算制作 COL
static
,所以它不是每个 M
对象的子对象?