如何在迭代时从地图中删除?喜欢:
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它将使迭代器无效
我需要浏览一个集合并删除符合预定义条件的元素.
这是我写的测试代码:
#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) 迭代的正确方法是使用迭代器.但是,我认为通过擦除,迭代器无效.
基本上我想做的是:
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) 我大致有以下代码.这可以更好或更有效吗?也许用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) 在STL中,几乎所有容器都具有擦除功能.我的问题是在向量中,erase函数返回一个指向向量中下一个元素的迭代器.地图容器不会这样做.相反,它返回一个空白.有人知道为什么会有这种不一致吗?
假设我想根据一些标准删除项目.让我们说:
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)
使迭代器无效.如何在每次删除后不重置迭代器的情况下执行此操作?
我有对象的地图,我想迭代它并删除一些条目.
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)
我可以这样做吗?
我有以下代码:
//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),但仍然出现段错误。
我有一张地图map1<string,vector<string>>我有一个地图"itr"的迭代器.我想从这个地图中删除"itr"指向的条目.我可以使用map1.erase(itr)函数; 在此行之后,迭代器"itr"变为无效.根据我在项目中的要求,迭代器必须指向下一个元素.可以任何身体帮助我提前重新启动这个坦克:) santhosh
我有一组迭代的对象,但是我可以在迭代期间决定现在需要删除其中一个(或多个)对象.
我的代码如下:
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".有人可以建议一个更好的方法吗?