C++ 从集合中的任意索引获取元素

C++ 从集合中的任意索引获取元素,c++,stl,C++,Stl,我有一个类型集set,我想得到一个迭代器,它不是开始 我正在做以下工作: set<int>::iterator it = myset.begin() + 5; set::iterator it=myset.begin()+5; 我很好奇为什么这不起作用,以及如何正确地将迭代器放到我想要的位置。myset.begin()+5仅适用于随机访问迭代器,而std::set中的迭代器不适用 对于输入迭代器,有函数std::advance: set<int>::iterator

我有一个类型集
set
,我想得到一个迭代器,它不是开始

我正在做以下工作:

set<int>::iterator it = myset.begin() + 5;
set::iterator it=myset.begin()+5;
我很好奇为什么这不起作用,以及如何正确地将迭代器放到我想要的位置。

myset.begin()+5
仅适用于随机访问迭代器,而
std::set
中的迭代器不适用

对于输入迭代器,有函数
std::advance

set<int>::iterator it = myset.begin();
std::advance(it, 5); // now it is advanced by five
std::next
需要一个正向迭代器。但是由于
std::set::iterator
是一个双向迭代器,所以
advance
next
都可以工作。

从C++11 std::set获取索引处的元素 <> >代码> STD::C++中的设置没有索引的吸引子,所以你必须自己迭代列表,然后复制到数组中,然后索引。 例如:

#include<iostream> 
#include<set> 
using namespace std; 
int main(){ 

    set<int> uniqueItems;        //instantiate a new empty set of integers 
    uniqueItems.insert(10); 
    uniqueItems.insert(20);      //insert three values into the set 
    uniqueItems.insert(30); 

    int myarray[uniqueItems.size()];    //create an int array of same size as the  
                                        //set<int> to accomodate elements 

    int i = 0;  
    for (const int &num : uniqueItems){ //iterate over the set 
        myarray[i] = num;               //assign it to the appropriate array 
        i++;                            //element and increment 
    }   

    cout << myarray[0] << endl;   //get index at zero, prints 10 
    cout << myarray[1] << endl;   //get index at one, prints 20 
    cout << myarray[2] << endl;   //get index at two, prints 30 

} 
#包括
#包括
使用名称空间std;
int main(){
set uniqueItems;//实例化一个新的空整数集
唯一项目。插入(10);
uniqueItems.insert(20);//在集合中插入三个值
唯一项目。插入(30);
int myarray[uniqueItems.size()];//创建一个与
//设置为容纳元素
int i=0;
for(const int&num:uniqueItems){//迭代集合
myarray[i]=num;//将其分配给适当的数组
i++;//元素和增量
}   

cout运算符+不定义此结构,只对随机访问迭代器有意义

第一个解决方案: 您可以使用,该函数重复使用递增或递减运算符(运算符++或运算符-),直到n个元素被提升

set<int>::iterator it = myset.begin();
std::advance(it, 5);
std::out << *it << std::endl; // == it + 5
set::iterator it=myset.begin();
std::advance(it,5);

STD::C和C++不是同一种语言。@ R. Martinho Fernandes不是线性时间复杂度的方法吗?我想知道在LoGigTimeTimes中是否有一些方法是有效的,因为毕竟,集合是平衡二叉树的。
int getSetAtIndex(set<int> myset, int index){ 
    int i = 0;  
    for (const int &num : myset){     //iterate over the set 
        if (i++ == index){                       
            return num;
        }
    }
    string msg = "index " + to_string(index) + \ 
        "is out of range"; 
    cout << msg; 
    exit(8);
} 
int main(){ 
    set<int> uniqueItems;        //instantiate a new empty set of integers 

    uniqueItems.insert(10); 
    uniqueItems.insert(20);      //insert three values into the set
    uniqueItems.insert(30); 

    cout << getSetAtIndex(uniqueItems, 1); 
} 
set<int>::iterator it = myset.begin();
std::advance(it, 5);
std::out << *it << std::endl; // == it + 5
set<int>::iterator it1 = myset.begin();
std::next(it1, 5); // == it1 + 5 
std::out << *it1 << std::endl; // == it1 + 5

set<int>::iterator it2 = myset.end();
std::prev(it2, 5); // == it2 - 5
std::out << *it2 << std::endl; // == it2 - 5