我有一个人的矢量。当时我认为给每个人一个独特的身份是个好主意。所以我做了:
class Person {
Person::Person(): id(currentID++){
}
const int id;
}
过了一段时间我想建立一个人的载体,所以我知道我必须提供few more functions:
vector的元素必须是:
Copyable, i.e. have a constructor compatible with T(const T&) Assignable, i.e. have an operator= compatible with operator=(const T&). Default-constructible, i.e. have a constructor compatible with T().
所以我尽我所能并想出了
Person::Person(const Person& other): id(other.id) {
}
Person& Person::operator=(const Person& other)
}
一切似乎都在精彩地运作。
但是有一天我试图从我的矢量中删除一个元素like i learned
vector<Person> persons;
persons.push_back(Person()); //id 0
persons.push_back(Person()); //id 1
persons.push_back(Person()); //id 2
vector<Person>::iterator it;
for(it = persons.begin() ; it != persons.end() ; ) {
if(it->getID() == 1) {
it = persons.erase(it);
} else {
it++;
}
}
//persons.size() == 1
我检查了调试器并看到擦除使用operator=
在调用擦除后移动元素。显然id没有改变,所以我删除了矢量中id 1之后的每个元素。
为什么会这样?我一直以为矢量擦除只是将指针从元素0移动到2以丢弃元素1.
我该如何处理const id
?我应该将其包含在operator=
吗?
我在C + 11(我使用过)中读到了一个移动运算符,如果我提供它,它会使用这个特殊运算符吗?