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;
}
}