const id,operator =和vector erase - 它们可以一起工作吗?

时间:2014-06-03 13:40:09

标签: c++ c++11 vector const erase

我有一个人的矢量。当时我认为给每个人一个独特的身份是个好主意。所以我做了:

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(我使用过)中读到了一个移动运算符,如果我提供它,它会使用这个特殊运算符吗?

0 个答案:

没有答案