提问人:Alexander Richter 提问时间:9/16/2022 更新时间:9/20/2022 访问量:99
为什么 C++ std 容器迭代器会忽略其底层容器的某些模板参数?
Why do C++ std container iterators ignore some template parameters of their underlying container?
问:
这是一个具体的例子。在下面的代码中,我本来会预料到编译错误,例如“无法将 std::map<int、int、cmp>::iterator 类型的值分配给 std::map<int、int>::iterator 类型的变量”。但是,我能够毫无问题地编译代码(g++ C++20 Wall)。谢谢你的帮助。
#include <map>
struct cmp {
bool operator()(const int a, const int b) const { return a > b; }
};
int main(int argc, char *argv[]) {
std::map<int, int> m1;
std::map<int, int>::iterator m1_it = m1.begin();
std::map<int, int, cmp> m2;
std::map<int, int, cmp>::iterator m2_it = m2.begin();
// Why do these work?
m1_it = m2.begin();
m2_it = m1.begin();
return 0;
}
答:
2赞
Jarod42
9/19/2022
#1
标准对迭代器类型设置了很少的约束,只是施加了一些行为。
特别:
他们不必在.所以可能是 的有效迭代器。
namespace std
T*
std::vector<T>
它们不必具有与容器相同的模板参数。对于上面的例子,可能是 for any 的迭代器。
T*
std::vector<T, Allocator>
Allocator
然而,事实上,它的类型安全性较低,模板参数较少,允许的实例化较少(编译速度更快,生成的类似代码较少,...
请注意,您的代码可能无法针对使用所有模板参数作为迭代器的编译器/库进行编译。
1赞
MSalters
9/19/2022
#2
一个实际原因是这可能会导致可执行文件更小。两种映射类型可以共享一个迭代器类型,因此所有迭代器函数也会共享。
评论
Compare
Compare