相关疑难解决方法(0)

如何在迭代时从地图中删除?

如何在迭代时从地图中删除?喜欢:

std::map<K, V> map;
for(auto i : map)
    if(needs_removing(i))
        // remove it from the map
Run Code Online (Sandbox Code Playgroud)

如果我使用map.erase它将使迭代器无效

c++ map c++11

160
推荐指数
6
解决办法
10万
查看次数

迭代时从STL集中删除元素

我需要浏览一个集合并删除符合预定义条件的元素.

这是我写的测试代码:

#include <set>
#include <algorithm>

void printElement(int value) {
    std::cout << value << " ";
}

int main() {
    int initNum[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    std::set<int> numbers(initNum, initNum + 10);
    // print '0 1 2 3 4 5 6 7 8 9'
    std::for_each(numbers.begin(), numbers.end(), printElement);

    std::set<int>::iterator it = numbers.begin();

    // iterate through the set and erase all even numbers
    for (; it != numbers.end(); ++it) {
        int n = *it; …
Run Code Online (Sandbox Code Playgroud)

c++ iterator std set c++-standard-library

140
推荐指数
4
解决办法
9万
查看次数

从std :: vector中删除,同时为每个执行a?

迭代的正确方法是使用迭代器.但是,我认为通过擦除,迭代器无效.

基本上我想做的是:

for(iterator it = begin; it != end; ++it)
{
    if(it->somecondition() )
    {
     erase it
    }

}
Run Code Online (Sandbox Code Playgroud)

没有v [i]方法我怎么能这样做?

谢谢

struct RemoveTimedEvent
{
    bool operator()(const AguiTimedEvent& pX, AguiWidgetBase* widget) const 
    {
        return pX.getCaller() == widget;
    }
};

void AguiWidgetContainer::clearTimedEvents( AguiWidgetBase* widget )
{
    std::vector<AguiTimedEvent>::iterator it = std::remove_if(timedEvents.begin(),
        timedEvents.end(), RemoveTimedEvent());
    timedEvents.erase(it, timedEvents.end());

}
Run Code Online (Sandbox Code Playgroud)

c++ vector

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

如何过滤std :: map中的项目?

我大致有以下代码.这可以更好或更有效吗?也许用std::remove_if?您可以在遍历地图时从地图中删除项目吗?我们可以避免使用临时地图吗?

typedef std::map<Action, What> Actions;
static Actions _actions;

bool expired(const Actions::value_type &action)
{
  return <something>;
}

void bar(const Actions::value_type &action)
{
  // do some stuff
}

void foo()
{
  // loop the actions finding expired items
  Actions actions;
  BOOST_FOREACH(Actions::value_type &action, _actions)
  {
    if (expired(action))
      bar(action);
    else
      actions[action.first]=action.second;
    }
  }
  actions.swap(_actions);
}
Run Code Online (Sandbox Code Playgroud)

c++ boost stl

27
推荐指数
3
解决办法
2万
查看次数

STL矢量vs地图擦除

在STL中,几乎所有容器都具有擦除功能.我的问题是在向量中,erase函数返回一个指向向量中下一个元素的迭代器.地图容器不会这样做.相反,它返回一个空白.有人知道为什么会有这种不一致吗?

c++ stl

14
推荐指数
3
解决办法
1万
查看次数

如何从QMap中删除值?

假设我想根据一些标准删除项目.让我们说:

QMap<int, int> map;
Run Code Online (Sandbox Code Playgroud)

我想删除所有值为奇数的项目.如果我使用迭代器:

for (auto it = map.begin(); it != map.end(); ++it)
    if (it.value() % 2 == 1)
        map.remove(it.key());
Run Code Online (Sandbox Code Playgroud)

这个代码可能是错的,因为调用了

map.remove(it.key()) 
Run Code Online (Sandbox Code Playgroud)

使迭代器无效.如何在每次删除后不重置迭代器的情况下执行此操作?

c++ qt iterator

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

当我从地图中删除条目时,`map :: iterator`会发生什么?

可能重复:
如何过滤std :: map中的项目?
如果在从头到尾迭代时调用map元素上的erase()会发生什么?

我有对象的地图,我想迭代它并删除一些条目.

typedef std::map<A,B> MapT;
MapT m;
MapT::iterator it;

for(it = m.begin(); it != m.end(); it++ ) {
    if( condition ) m.erase(it);
}
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?

c++ iterator map

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

从地图中删除时出现奇怪的段错误

我有以下代码:

//update it in the map
      std::map<std::string, std::string>::iterator it;
      for(it = spreadsheets.at(i).cells.begin(); it != spreadsheets.at(i).cells.end(); ++it)
      {
        if(it->first == change.first)
        {
          if(change.second == "")
          {
            spreadsheets.at(i).cells.erase(change.first);
          }
          else
          {
          it->second = change.second;
          }
        }
      }
Run Code Online (Sandbox Code Playgroud)

上面的代码在我的 mac 上完美运行,但是当我在 Linux 计算机上运行时,它会抛出一个 seg 错误spreadsheets.at(i).cells.erase(change.first);

知道是什么导致了这个错误吗?我尝试更改erase(change.first)erase(it),但仍然出现段错误。

c++

3
推荐指数
2
解决办法
5320
查看次数

删除映射中的特定条目,但迭代器必须指向删除后的下一个元素

重复:

如果在从头到尾迭代时调用地图元素上的擦除会发生什么

如何从stdmap过滤项目

我有一张地图map1<string,vector<string>>我有一个地图"itr"的迭代器.我想从这个地图中删除"itr"指向的条目.我可以使用map1.erase(itr)函数; 在此行之后,迭代器"itr"变为无效.根据我在项目中的要求,迭代器必须指向下一个元素.可以任何身体帮助我提前重新启动这个坦克:) santhosh

c++ stl map

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

原位删除元素的最佳方法

我有一组迭代的对象,但是我可以在迭代期间决定现在需要删除其中一个(或多个)对象.

我的代码如下:

if( ! m_Container.empty() )
    {
        for(  typedefedcontainer::iterator it = m_Container.begin();
              it != m_Container.end(); 
              ++it  )
        {
            if( ! ( SomeFunction( (*it), "test", "TEST!", false ))  )
            {
            // If function returns false, delete object.
                m_Container.erase( it );
                AsyncResponseStore::iterator it = m_asyncResponses.begin();
            }

        }


    }
Run Code Online (Sandbox Code Playgroud)

但是当然,当我擦除一个对象时,我得到一个错误:"Map/set iterator not incrementable".有人可以建议一个更好的方法吗?

请参阅: 如果在从开始到结束迭代时调用map元素上的erase()会发生什么?

c++ stl set

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

标签 统计

c++ ×10

stl ×4

iterator ×3

map ×3

set ×2

boost ×1

c++-standard-library ×1

c++11 ×1

qt ×1

std ×1

vector ×1