gpt4 book ai didi

c++ - 迭代器的 STL 容器如何运行?

转载 作者:太空狗 更新时间:2023-10-29 19:39:33 24 4
gpt4 key购买 nike

这个问题在我看来是出于学术兴趣而不是实际用例:

STL 关联容器,即 [multi]set 和 [multi]map,包含如下重载方法:

// for std::map
void erase ( iterator position );
size_type erase ( const key_type& x );

// for std::set
iterator erase (const_iterator position);
size_type erase (const value_type& val);

我的问题:如果 key_type 怎么办? value_typeiterator 还是 const_iterator

我知道将迭代器存储在容器中很危险,而且可能毫无用处。但是实际的 STL 实现会如何表现呢?是否定义了行为?

最佳答案

问题是迭代器类型会有所不同。它们永远不会相同。原因:在这种情况下必须满足以下等式:

map<K, V>::iterator == K
map<K, V>::const_iterator == K

然而,这些等式不能成立(你看到递归了吗)?请记住,迭代器类型取决于容器类型,包括其模板参数。

因此在下面的示例中,键类型和迭代器类型是不同的,尽管您试图使它们相等:

map<map<int,int>::iterator, int> i;

确实,由于上面的原因,我无法实例化一个键等于其迭代器类型的映射。因此,重载的 erase 方法如下所示:

void erase ( map<map<int,int>::iterator, int>::iterator position );
size_type erase ( const map<int,int>::iterator & x );

所以重载永远不会有歧义。如果类型相同,就会产生歧义,请参见:http://ideone.com/fMdwru .但是,编译器只会在您使用该方法时才会发出警告。所以,假设我们可以在这里引入歧义,只要我们想使用该方法,它只会打扰我们。我的意思是,我们仍然可以实例化 map 类型(如果它存在的话)。

关于c++ - 迭代器的 STL 容器如何运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14215818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com