首页 文章

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

提问于
浏览
1

我有以下带有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 回答

  • 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 是一个有序容器,元素不会按插入顺序显示 .

  • 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?

  • 0

    问题是集合没有索引访问权限 . 但你仍然可以这样做:

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

    这基本上是一个交互者和“移动它”前进9个地方......

  • 2

    您无法在clear 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,但返回索引而不是迭代器 .

相关问题