在迭代地图时从地图中删除多个元素

问题描述 投票:0回答:1

我有一个地图,它以用户名作为键,我需要为这些用户名获取 ID。 我以 20 个为一组执行此操作,因为为每个用户调用 api 可能有点问题。 因此,一旦我收到对所有这 20 个项目(失败或成功)的响应,我想从地图中删除成功的用户名。 我知道在地图上迭代时擦除的方法,但这是一次针对单个元素的方法。 我怎样才能做到这一点?

for (auto it = myMap.begin(); it != myMap.end();it++)//myMap is a class variable {          
  keys.push_back(it->first);
  values.push_back(it->second);

  if (keys.size() != BATCH_SIZE)
    continue;
                
  vector<string> response = BatchGetResponse(keys);
  it = ParseResponse(keys, values, response);
}

std::map<string, string>::iterator ParseResponse(vector<string>& keys,vector<string>& values, vector<string>& reponse)
{
    auto it = myMap.begin();
    for (int i = 0; i < int(values.size()); i++) {
        if (response[i] == "")
            continue;
        it = myMap.erase(myMap.find(keys[i]));
        updateMap(objectGuidsOfPaths[i], response[i]);
    }
    keys.clear();
    values.clear();
    return it;
}

这是执行此操作的正确方法吗,我不确定如果我没有获得 20 个元素中的任何一个的成功响应,因为迭代器将指向 myMap.begin()

c++ dictionary c++17 erase
1个回答
0
投票

我不确定你在做什么和问exacly.

像这样调用

map::erase
返回被删除元素之后的迭代器。

因此,如果你删除最后一个元素,你可能会返回

myMap.end()
然后你的第一个 for 循环将首先递增迭代器,然后再测试它是否是
myMap.end()
。这是未定义的行为。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.