我想使用erase方法从向量中清除元素.但是这里的问题是元素不能保证在向量中只出现一次.它可能存在多次,我需要清除所有这些.我的代码是这样的:
void erase(std::vector<int>& myNumbers_in, int number_in)
{
std::vector<int>::iterator iter = myNumbers_in.begin();
std::vector<int>::iterator endIter = myNumbers_in.end();
for(; iter != endIter; ++iter)
{
if(*iter == number_in)
{
myNumbers_in.erase(iter);
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> myNmbers;
for(int i = 0; i < 2; ++i)
{
myNmbers.push_back(i);
myNmbers.push_back(i);
}
erase(myNmbers, 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码显然崩溃了,因为我在迭代它时改变了向量的末尾.实现这一目标的最佳方法是什么?也就是说有没有办法做到这一点,而无需多次迭代矢量或创建一个矢量的副本?
下面的 C++ 代码似乎可以工作,我很想知道如何工作:
std::map<char,char> mymap;
mymap['a'] = 'A'; mymap['b'] = 'B'; mymap['c'] = 'C';
mymap['d'] = 'D'; mymap['e'] = 'E'; mymap['f'] = 'F';
mymap['g'] = 'G'; mymap['h'] = 'H'; mymap['i'] = 'I';
bool erase = true;
for (auto& [key, value] : mymap) {
if (erase) mymap.erase(key); // Erasing every other item!!
erase = !erase;
}
Run Code Online (Sandbox Code Playgroud)
我在迭代地图时修改地图。来自 JVM 世界,我期待着某种CuncurrentModificationException......但它似乎在 C++ 中工作得很好。
难道这真的坏了,我只是运气好?如果不是,那么它在幕后是如何工作的?
大多数这样做的例子都使用迭代器,我猜这是有原因的吗?for (auto& it = mymap::begin(); it != mymap::end; ) { it++ }这种方式对我来说看起来更干净,我怀疑有人会在没有充分理由的情况下选择更冗长和不太清晰的方法。
我正在尝试使用迭代器擦除向量中的最后一个元素.但是在擦除元素时我遇到了分段错误.
以下是我的代码:
for (vector<AccDetails>::iterator itr = accDetails.begin(); itr != accDetails.end(); ++itr) {
if (username == itr->username) {
itr = accDetails.erase(itr);
}
}
Run Code Online (Sandbox Code Playgroud)
我的迭代有问题吗?
在这段代码片段中,Update()返回一个布尔值,如果返回false,我想从向量中删除该元素.
但是,这会产生调试断言失败的运行时错误.表达式是"矢量迭代器不可递增".
代码:
for(auto iter = someVector.begin(); iter != someVector.end(); ++iter){
if(!iter->get()->Update()) iter = someVector.erase(iter);
}
Run Code Online (Sandbox Code Playgroud)
我试过从迭代器中减去如下:
for(auto iter = particles.begin(); iter != particles.end(); ++iter){
if(!iter->get()->Update()) iter = --(particles.erase(iter));
}
Run Code Online (Sandbox Code Playgroud)
...但这导致"矢量迭代器不可减少".
如何使我的代码按预期工作; 以便在Update()函数返回false时删除vector元素?
我有一个for循环遍历一个对象向量.如果一个对象不满足条件,我想通过循环重复相同的对象,直到它满足条件.
int TrainDog(const vector<Dog> &dogs, const Cat big_cat) {
for (auto const dog : dogs) {
dog->Sit(); // tell the dog to sit
if (!dog->IsBarking()) // if dog isn't barking
dog->Eat(raw_burger); // then reward dog
else { // else
dog->PlayWith(big_cat); // punish dog
??? // and train again ???
big_cat++; // with bigger cat
}
}
}
Run Code Online (Sandbox Code Playgroud)
我宁愿保留这个干净的迭代器,而不是使用传统的索引变量语法.