【问题标题】:Why set<string>::iterator cannot use as key of map?为什么 set<string>::iterator 不能用作 map 的键?
【发布时间】:2011-08-10 03:05:35
【问题描述】:

我有一段这样的代码:

set<string>::iterator it1;
set<string>::iterator it2;
pair<set<string>::iterator,bool> ret;

set<string> s;
ret = s.insert("bbbb1");
it1 = ret.first;

ret = s.insert("bbbb2");
it2 = ret.first;

map<set<string>::iterator, set<string>::iterator> m;

m.insert(make_pair(it1,it2));

但最后一行“m.insert(make_pair(it1,it2));”失败了。。

【问题讨论】:

  • 使用迭代器作为映射键是一个糟糕的想法(因为任何随后失效的迭代器都可能导致未定义的行为)。不要这样做。 :-(
  • @Chris:std::set 的迭代器很少失效。
  • @James:是的,但如果项目从集合中移除,则与这些项目对应的迭代器将是。 :-)

标签: c++ stl map iterator key


【解决方案1】:

std::set 迭代器不是随机访问迭代器,因此它们的可比性不低于。

std::map 中用作键的类型必须能够使用strict weak ordering 进行排序。默认情况下,std::map 使用 &lt; 来订购密钥。您可以通过在定义std::map 的类型时提供比较器来更改此行为。您可能希望使用迭代器指向的对象执行一些关系比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2018-10-31
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多