C++ 如何从包含向量作为C+中的值的地图中删除对象+;

C++ 如何从包含向量作为C+中的值的地图中删除对象+;,c++,C++,我有一个地图,其中包含一个向量类型的消息 std::map<std::string, std::vector<Message>> storage; 现在我试图从地图中删除一个具有优先级(比如3)的对象。我正在为它使用以下函数。但它不起作用 void deleteByMessagePriority(int priority) { if (checkPriorityOfMessage(priority)) { for (std::map&l

我有一个地图,其中包含一个向量类型的消息

std::map<std::string, std::vector<Message>> storage;
现在我试图从地图中删除一个具有优先级(比如3)的对象。我正在为它使用以下函数。但它不起作用

void deleteByMessagePriority(int priority)
{
    if (checkPriorityOfMessage(priority))
    {

        for (std::map<std::string, std::vector<Message>>::iterator it = storage.begin(); it != storage.end(); it++)
        {
            std::vector<Message> listOfMsgs = it->second;
            for (std::vector<Message>::iterator vec_it = listOfMsgs.begin(); vec_it != listOfMsgs.end(); vec_it++)

            //for(int index = 0;index < listOfMsgs.size();index++)
            {
                if (vec_it->getPriority() == priority)
                {
                    listOfMsgs.pop_back();
                }
            }


        }
    }
}
void deleteByMessagePriority(int优先级)
{
if(检查消息优先级(优先级))
{
for(std::map::iterator it=storage.begin();it!=storage.end();it++)
{
std::vector listOfMsgs=it->second;
for(std::vector::iterator vec_it=listOfMsgs.begin();vec_it!=listOfMsgs.end();vec_it++)
//对于(int index=0;indexgetPriority()==优先级)
{
listofmgs.pop_back();
}
}
}
}
}

仔细查看以下内容:

            if (vec_it->getPriority() == priority)
            {
                listOfMsgs.pop_back();
            }
您正在查看一条消息(由
vec\u it
引用的消息)的优先级,但是如果它匹配,您将删除什么

我不会编写自己的循环,而是使用
erase
std::remove_if
一次删除该向量中您关心的所有项

for (auto & item : storage) {
    auto &vec = item.second;
    auto start_junk = std::remove_if(
        vec.begin(), vec.end(), 
        [=](Message const &m) { return m.priority == priority; });
    vec.erase(start_junk, vec.end());
}  
pop_back()
删除不需要的向量的最后一个元素。是否要检查 还请记住,
erase()
使迭代器无效,因此您需要迭代器到删除元素后的下一个元素,幸运的是,我们可以使用
erase
的返回值

if (vec_it->getPriority() == priority)
    {
       vec_it = listOfMsgs.erase(vec_it); //returns iterator to the element after vec_it which can also be `listOfMsgs.end()`
std::vector listofmgs=it->second;
.
.
.
listofmgs.pop_back();
您正在复制列表,只是为了修改副本。你的意思是:

std::vector<Message>& listOfMsgs = it->second;
std::vector&listofmgs=it->second;
然后可以继续擦除元素。正如Gaurav Sehgal所说,使用擦除的返回值:

std::vector<Message>::iterator vec_it = listOfMsgs.begin();
while (vec_it != listOfMsgs.end())
{
    if (vec_it->getPriority() == priority)
    {
        vec_it = listOfMsgs.erase(vec_it);
    }
    else
    {
        ++vec_it;
    }
}
std::vector::iterator vec_it=listOfMsgs.begin();
while(vec_it!=listofmgs.end())
{
如果(vec_it->getPriority()==优先级)
{
vec_it=listofmgs.erase(vec_it);
}
其他的
{
++vec_it;
}
}

但它不起作用。它是如何工作的?
listofmgs.pop_back()
不会删除
vec\u it
,它会删除
listofmgs
的最后一个元素。查找
vector::erase
也别忘了,erase会使所有迭代器失效,这有点相切,但我认为值得一提的是:如果你在一个映射中迭代,以过滤掉某个值标准上的项,那么该值不应该在映射的键中吗?非常感谢。但它只删除一个具有匹配优先级的元素。如果我有多个消息对象,它只会删除一个。现在我已经更改了代码。@sohan为什么它只删除一个。你仍然有循环。对吗?是的,我有循环。我已经插入了元素-消息a(“hello1”,“yellow”,1);内部消息(a、checkMessageType、checkPriorityOfMessage);信息b(“hello2”,“黄色”,3);消息间(b,checkMessageType,checkPriorityOfMessage);信息c(“hello3”,“红色”,3);消息间(c,checkMessageType,checkPriorityOfMessage);信息d(“你好”,“红色”,1);消息间(d,checkMessageType,checkPriorityOfMessage);信息e(“你好”,“红色”,1);消息间(e,checkMessageType,checkPriorityOfMessage);我收到了这个错误-重载函数“std::vector::erase[with _Ty=Message,_Alloc=std::allocator]”的实例没有与参数列表和对象匹配(对象具有阻止匹配的类型限定符)参数类型是:(std:_vector\u const\u迭代器,std:_vector\u const\u迭代器)对象类型为:const std::vector@sohan:我已经更正了代码。我无意中使用了对const的引用,这(当然)会阻止我们修改它引用的数据。
std::vector<Message> listOfMsgs = it->second;
.
.
.
listOfMsgs.pop_back();
std::vector<Message>& listOfMsgs = it->second;
std::vector<Message>::iterator vec_it = listOfMsgs.begin();
while (vec_it != listOfMsgs.end())
{
    if (vec_it->getPriority() == priority)
    {
        vec_it = listOfMsgs.erase(vec_it);
    }
    else
    {
        ++vec_it;
    }
}