相关疑难解决方法(0)

从矢量中删除元素

我想使用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++ stl vector erase

94
推荐指数
3
解决办法
13万
查看次数

C++ 在迭代映射时擦除映射中的键值

下面的 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++ }这种方式对我来说看起来更干净,我怀疑有人会在没有充分理由的情况下选择更冗长和不太清晰的方法。

c++ iterator

2
推荐指数
1
解决办法
809
查看次数

擦除向量中的最后一个元素时的分段错误

我正在尝试使用迭代器擦除向量中的最后一个元素.但是在擦除元素时我遇到了分段错误.

以下是我的代码:

    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)

我的迭代有问题吗?

c++ iterator vector erase

1
推荐指数
1
解决办法
1067
查看次数

基于条件语句删除循环中的向量元素

在这段代码片段中,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元素?

c++ iterator vector

0
推荐指数
1
解决办法
1156
查看次数

如何在c ++ 11中有条件地跳过for循环的post操作?

我有一个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)

我宁愿保留这个干净的迭代器,而不是使用传统的索引变量语法.

c++ for-loop c++11

-2
推荐指数
1
解决办法
132
查看次数

标签 统计

c++ ×5

iterator ×3

vector ×3

erase ×2

c++11 ×1

for-loop ×1

stl ×1