增加迭代器标准映射
Increment an iterator standard map
ALL,
std::map<int, std::string> addressee;
std::map<int, std::string>::iterator it1, it2;
for( it1 = addressee.begin(); it1 != addressee().end(); it1++ )
{
bool found = false;
for( it2 = it1 + 1; it2 != addressee.end() && !found; it2++ )
{
if( it1->second == it1->second )
{
printf( "Multiple occurences of addressees found" );
found = true;
}
}
}
gcc抛出一个错误:运算符+不匹配。
这段代码是我现在尝试做的事情的简化版本。我想我可以使用std::advanced(),但这似乎只是浪费函数调用。
有更好的解决办法吗?
std::map
没有随机访问迭代器,只有双向迭代器。因此没有+ n
操作。相反,使用std::next
:
#include <iterator>
#include <map>
// ...
for (auto it1 = addressee.begin(), e = addressee.end(); it1 != e; ++it1)
{
for (auto it2 = std::next(it1); it2 != e; ++it2)
{
if (it1->second == it2->second)
{
// ...
break;
}
}
}
事实上,您应该始终使用std::next
,因为它知道其参数的迭代器类别以及计算下一个迭代器的最有效方法。这样,您就不必关心碰巧使用的特定容器。
@Kerrek已经指出了如何在语法层面处理您遇到的问题。
我将从更算法的层面来考虑这个问题——你真正想完成的是什么,而不仅仅是看如何修复特定的代码行。
除非所涉及的集合是可靠的miny,所以此操作的效率根本无关紧要,否则我会从集合中复制映射的值,然后在其上使用sort
和unique
来查看是否有重复:
std::vector<std::string> temp;
std::transform(addressee.begin(), addressee.end(),
std::back_inserter(temp),
[](std::pair<int, std::string> const &in) { return in.second; });
std::sort(temp.begin(), temp.end());
if (std::unique(temp.begin(), temp.end()) != temp.end()) {
std::cout << "Multiple occurrences of addressees found";
found = true;
}
这将复杂性从O(N2)降低到O(N log N),如果集合很大,这通常是相当可观的。
相关文章:
- 在子集化后将包含索引号的列表列表映射到标准索引序列
- 定义具有非标准签名的自定义映射比较器
- 如何将整数向量插入到键中,标准::映射的值
- 标准::映射::合并的计算时间复杂度
- 标准::映射转换器模板
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- 替换标准::映射值时崩溃
- 标准::键映射和/或 boost::any 类型的值的类型检查
- 如果可能,标准::映射分配是否静态
- 如何在标准::映射中try_emplace POD 结构?
- 如何通过套接字传输标准::多映射数据
- 多类型标准映射
- 五月标准::映射键地址值数
- 处理对存储在私有映射中的值的封装访问的标准方法,而不破坏C++中的抽象
- 模板标准::映射为类成员
- 模板标准::映射::迭代器实例化
- C++ 如何在标准::多映射中插入
- 推进标准映射的迭代器
- 标准::映射 标准::集合包含重复的键
- std::映射标准分配器性能与块分配器