多重映射迭代器是否也需要排序函数的类型?
希望这是一个快速且容易回答的问题。我是否需要下面的 typedef
中的 bool(*)(char,char)
,或者我可以只使用 multimap
mmIt
迭代器与地图 mmap
一起使用?感谢您的帮助!
代码片段:
bool fncomp (char lhs, char rhs) {return lhs < rhs;}
typedef multimap<char,int,bool(*)(char,char)>::iterator mmIt;
multimap<char,int,bool(*)(char,char)> mmap(fncomp);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果
multimap::iterator
是不依赖于比较器类型的其他内容的 typedef,那么您可能没问题 - 但这是一个实现细节,并且肯定会如果它是真正的嵌套类型,则中断。避开它:
避免在任何地方写出整个多重映射参数列表。
If
multimap<K,V,Comp>::iterator
is a typedef for something else that doesn't depend on the comparator type, you might be ok - but this is an implementation detail, and will definitely break if it's a genuinely nested type.Just sidestep it:
and avoid writing out the whole multimap parameter list everywhere.
标准允许您的代码是正确的,但它不保证它。
例如,Visual Studio 11 有所谓的 可怕的迭代器 不依赖于不必要的容器类型(分配器、谓词)。但是,如果迭代器是这样实现的,则完全是实现定义的。
The standard allows your code to be correct, but it doesn't guarantee it.
Visual Studio 11 for example has so-called SCARY iterators that don't depend on unnecessary types of the container (allocator, predicate). However, if iterators are implemented like that is completely implementation defined.
尽管迭代器不需要比较函数,但是
std::map>
的迭代器通常与迭代器是完全不同的类型例如std::map>
,因为迭代器类型是在特定映射类型内部定义的,因此也是在其上定义的。std::map
实际上是std::map,std::allocator>
。因此,如果您的地图的比较器与默认比较器不同(在您的情况下为std::less
),那么每当您使用它时,您都需要用它显式实例化地图类型。Although the iterator doesn't need the comparison function, an iterator for say a
std::map<char,int,std::less<char>>
generally is a completely different type than an iterator for say astd::map<char,int,std::greater<char>>
, because the iterator type is defined inside the specific map type and therefore on it.A
std::map<K,T>
is actually a shortcut forstd::map<K,T,std::less<K>,std::allocator<std::pair<const K,T>>>
. So if the comparator of your map is different from the default one (which isstd::less<char>
in your case), then you need to explicitly instantiate the map type with it whenever you use it.