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

Is it possible to get a single element of a set in C++ STL?

本文关键字:集合 单个 元素 STL 是否      更新时间:2023-10-16

i具有以下C 代码,带有C STL Vector,

#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:错误:"操作员[]"无匹配(操作数类型为 " std :: set"answers" int"( cout&lt;&lt;myset [10]&lt;&lt;endl;

所以,我的问题是,是否有任何方法可以打印任何C 中的STL向量的STL集合?如果是,如何?

同时,我们可以使用迭代器,但我知道,它可以与完整组合使用。:(

是的,这是可能的,但不使用 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是一个有序的容器,这些元素不会以您插入它们的顺序出现。

您无法通过索引访问设置元素。但是,您可以在迭代器上使用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);

此处解释了这两个版本之间的区别:STD :: Advance和STD :: Next有什么区别?

问题是集合无法通过索引访问。但是您仍然可以做类似的事情:

set<int>::iterator myIterator = myset.begin();
advance(myIterator , 9);
int theTenth= *myIterator;

基本上是得到一个互动器,然后"移动"向前9个位置...

您不能在Clear C 中进行此操作,但是如果您使用GCC(并且您可能会根据汇编错误进行(,则可以创建基于策略的集合,其行为正常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的结构,该结构具有2种其他方法:find_by_order(int p)order_of_key(int k)。第一个是您想要的,它将迭代器返回到p-th元素。第二个类似于lower_bound,但返回索引而不是迭代器。