我有以下带有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&lt;&lt; myset [10]&lt;&lt; ENDL;
所以,我的问题是,有没有办法在C ++中打印STL向量的任何STL集合元素?如果有,怎么样?
同时我们可以使用迭代器,但据我所知,它可以使用全套。 :)
答案 0 :(得分:7)
是的,这是可能的,但不能使用operator[]
。
std::set
未提供operator[]
,因为它不是随机访问容器。相反,必须使用迭代器来访问其元素。
auto first = myset.begin(); // get iterator to 1st element
std::advance(first, 9); // advance by 9
std::cout << *first; // 10th element
请注意,std::set
是一个有序容器,元素不会按插入顺序显示。
答案 1 :(得分:3)
您无法通过索引访问set元素。但是,您可以在迭代器上使用std::advance
。
set<int>::iterator it = myset.begin();
std::advance(it, 5); // advanced by five
std::next
也出现在C++11
,
auto it = std::next(myset.begin(), 5);
这两个版本之间的区别在这里解释: What's the difference between std::advance and std::next?
答案 2 :(得分:2)
问题是集合无法通过索引访问。 但你仍然可以这样做:
set<int>::iterator myIterator = myset.begin();
advance(myIterator , 9);
int theTenth= *myIterator;
基本上是获取一个交互者并且&#34;移动它&#34;前进9个地方......
答案 3 :(得分:0)
您无法在明确的C ++中执行此操作,但如果您使用GCC(并且您可能根据编译错误执行此操作),则可以创建基于策略的set,其行为与普通STL集相同,但支持操作你问过。
#include <iostream>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> indexed_int_set;
int main ()
{
indexed_int_set myset;
for (int i=0; i<15; i++)
myset.insert (i);
cout << *myset.find_by_order(10) << endl;
return 0;
}
在上面的代码中,我们定义了名为indexed_int_set
的结构,它有另外两种方法:find_by_order(int p)
和order_of_key(int k)
。
第一个是你想要的,它返回一个迭代器到第p个元素。
第二个类似于lower_bound,但返回索引而不是迭代器。