我如何从 multimap<int, std::pair<int, bool>> 中删除重复的元素?
How can i erase duplicated elements from a multimap<int, std::pair<int, bool>>?
我有一张重复的多图。当我完成元素的收集后,我想删除重复项。
这是容器:
std::multimap<int, std::pair<int, bool>> container;
以下代码在迭代中。(它是原始版本的简化版本)
container.emplace(LeafId, std::make_pair(NodeId, isElectronic));
这是好的解决方案吗?
std::pair<int, std::pair<int, bool>> lastValue {-1 , {-1, -1}};
for (auto it = container.cbegin(); it != container.cend();)
{
if (it->first == lastValue.first && it->second == lastValue.second)
{
it = container.erase(it);
} else
{
lastValue = *it;
++it;
}
}
Is it good solution?
除非你在 multimap 中保持内部对排序,否则这不是一个好的解决方案,因为它会遗漏重复项。如果可以更改数据类型,则可以使用:
std::map<int, std::vector<std::pair<int, bool>>>
而不是 std::multimap
,然后对每个元素排序向量并使用此处所述的标准算法删除重复项 Removing duplicates in a vector of strings
如果你不能,我建议使用额外的 std::set
或 std::unordered_set
:
std::set<std::pair<int, bool>> tset;
int lastValue = 0;
for (auto it = container.cbegin(); it != container.cend();)
{
if( it->first != lastValue ) {
tset.clear();
lastValue = it->first;
}
if( !tset.insert( it->second ).second )
it = container.erase( it );
else
++it;
}
我有一张重复的多图。当我完成元素的收集后,我想删除重复项。
这是容器:
std::multimap<int, std::pair<int, bool>> container;
以下代码在迭代中。(它是原始版本的简化版本)
container.emplace(LeafId, std::make_pair(NodeId, isElectronic));
这是好的解决方案吗?
std::pair<int, std::pair<int, bool>> lastValue {-1 , {-1, -1}};
for (auto it = container.cbegin(); it != container.cend();)
{
if (it->first == lastValue.first && it->second == lastValue.second)
{
it = container.erase(it);
} else
{
lastValue = *it;
++it;
}
}
Is it good solution?
除非你在 multimap 中保持内部对排序,否则这不是一个好的解决方案,因为它会遗漏重复项。如果可以更改数据类型,则可以使用:
std::map<int, std::vector<std::pair<int, bool>>>
而不是 std::multimap
,然后对每个元素排序向量并使用此处所述的标准算法删除重复项 Removing duplicates in a vector of strings
如果你不能,我建议使用额外的 std::set
或 std::unordered_set
:
std::set<std::pair<int, bool>> tset;
int lastValue = 0;
for (auto it = container.cbegin(); it != container.cend();)
{
if( it->first != lastValue ) {
tset.clear();
lastValue = it->first;
}
if( !tset.insert( it->second ).second )
it = container.erase( it );
else
++it;
}