多重映射迭代器是否也需要排序函数的类型?

发布于 2025-01-03 22:07:04 字数 448 浏览 1 评论 0 原文

希望这是一个快速且容易回答的问题。我是否需要下面的 typedef 中的 bool(*)(char,char),或者我可以只使用 multimap::iterator< /code> 以便将 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);

Hopefully this is a quick and easy question to answer. Do I need the bool(*)(char,char) in my typedef below, or can I just use multimap<char,char>::iterator in order to use mmIt iterators with the map mmap? Thanks for the help!

Code snippet:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

川水往事 2025-01-10 22:07:04

如果 multimap::iterator 是不依赖于比较器类型的其他内容的 typedef,那么您可能没问题 - 但这是一个实现细节,并且肯定会如果它是真正的嵌套类型,则中断。

避开它:

typedef multimap<char,int,bool(*)(char,char)> mMap;
typedef mMap::iterator mmIt;

避免在任何地方写出整个多重映射参数列表。

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:

typedef multimap<char,int,bool(*)(char,char)> mMap;
typedef mMap::iterator mmIt;

and avoid writing out the whole multimap parameter list everywhere.

苍白女子 2025-01-10 22:07:04

标准允许您的代码是正确的,但它不保证它。

例如,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.

小伙你站住 2025-01-10 22:07:04

尽管迭代器不需要比较函数,但是 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 a std::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 for std::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 is std::less<char> in your case), then you need to explicitly instantiate the map type with it whenever you use it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文