由set2.begin()返回的迭代器类型
Iterator type returned by set2.begin()
在一个测验问题中,我认为以下程序不会编译,因为我期望迭代器类型为 set<int>::iterator
而不是 set<int, int>::iterator
。
我可以在C 98,C 11和C 14中成功编译以下程序,并打印结果9 5 4 3 2 1 0 0, 1, 2, 3, 4, 5, 9,
。看来该程序是正确的。
为什么在该行上可以接受迭代器类型set<int, int>::iterator
?
#include <iostream>
#include <set>
#include <vector>
#include <functional>
using namespace std;
int main(){
int mynumbers[] = { 3, 9, 0, 2, 1, 4, 5 };
vector<int> v(mynumbers, mynumbers+7);
set<int> set1(v.begin(),v.end());
set<int, greater<int> > set2(v.begin(), v.end());
//
// The following iterator type compiles. Why is that so ?
//
for(set<int, int>::iterator i=set2.begin();i!= set2.end(); i++)
cout<<*i<<" ";
for(set<int>::iterator i=set1.begin();i!= set1.end(); i++)
cout<<*i<<", ";
cout<<endl;
return 0;
}
为什么在该行上可以接受迭代器类型
set<int, int>::iterator
?
不是。int
不是比较器。您正在违反那里的标准要求。该程序的形式不佳。
一些编译器更严格地检查这些要求。
供参考:正确的类型为set<int, greater<int> >::iterator
,或CC 11及以后的auto
。 set<int>::iterator
也是错误的。
相关文章:
- 如何在c++迭代器类型中包装std::chrono
- 定义模板参数的迭代器类型
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- C++不兼容的迭代器类型
- 如何推导 std::高级迭代器类型?
- 在 stl 容器包装器中定义迭代器类型
- 矢量迭代器类型未知
- STD ::向量迭代器类型和允许的操作
- 检查容器模板类中的迭代器类型
- 如何断言模板参数的类型 STL 迭代器类型
- 检测容器是否具有迭代器类型
- 由set2.begin()返回的迭代器类型
- 序列容器的迭代器类型是什么?
- 如何推断嵌套最多的迭代器类型
- 为什么迭代器类型与矢量容器中的 value_type * 不匹配
- ISO C++禁止声明没有自动迭代器类型的“it”
- 使用的迭代器类型错误
- 列表的迭代器类型
- 如何打印迭代器类型列表<pair<int,int>>::iterator itrator it指向的元素
- 为什么 void* 不是迭代器类型?