我有以下带有C STL向量的C代码,
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector <int> v;
for (int i=0; i<15; i++)
v.push_back (i);
cout << v[10] << endl;
return 0;
}
它通常会打印存储在第10个索引中的元素 . 输出为10 .
但我也用C STL设置同样的东西,
#include <iostream>
#include <set>
using namespace std;
int main ()
{
set <int> myset;
for (int i=0; i<15; i++)
myset.insert (i);
cout << myset[10] << endl;
return 0;
}
它给我编译错误显示以下消息:(
prog.cpp:在函数'int main()'中:prog.cpp:12:18:错误:'operator []'不匹配(操作数类型是'std :: set'和'int')cout << myset [10] << endl;
所以,我的问题是,有没有办法打印任何STL集的元素,就像C中的STL向量一样?如果有,怎么样?
同时我们可以使用迭代器,但据我所知它可以使用全套 . :)
4 回答
是的,这是可能的,但不是使用
operator[]
.std::set
不提供operator[]
,因为它不是随机访问容器 . 相反,必须使用迭代器来访问其元素 .请注意,
std::set
是一个有序容器,元素不会按插入顺序显示 .您无法通过索引访问set元素 . 但是,您可以在迭代器上使用
std::advance
.std::next
也在C++11
,这两个版本之间的区别在这里解释:What's the difference between std::advance and std::next?
问题是集合没有索引访问权限 . 但你仍然可以这样做:
这基本上是一个交互者和“移动它”前进9个地方......
您无法在clear C中执行此操作,但如果您使用GCC(并且您可能根据编译错误执行此操作),则可以创建基于策略的set,其行为与普通STL集相同,但支持您询问的操作 .
在上面的代码中,我们定义了名为
indexed_int_set
的结构,它有另外两种方法:find_by_order(int p)
和order_of_key(int k)
. 第一个是你想要的,它返回一个迭代器到第p个元素 . 第二个类似于lower_bound,但返回索引而不是迭代器 .