是否可以在C ++ STL中获取集合中的单个元素?

时间:2017-05-31 15:22:13

标签: c++ c++11 vector stl set

我有以下带有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集合元素?如果有,怎么样?

同时我们可以使用迭代器,但据我所知,它可以使用全套。 :)

4 个答案:

答案 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,但返回索引而不是迭代器。