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

时间:2012-01-18 08:55:52

标签: c++ stl

我有一组类型set<int>,我希望得到一个不是开头的迭代器。

我正在做以下事情:

set<int>::iterator it = myset.begin() + 5;

我很好奇为什么这不起作用,将迭代器放到我想要的地方的正确方法是什么。

3 个答案:

答案 0 :(得分:20)

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

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

set<int>::iterator it = myset.begin();
std::advance(it, 5); // now it is advanced by five

在C ++ 11中,还有std::next类似但不改变其参数:

auto it = std::next(myset.begin(), 5);

std::next需要一个前向迭代器。但由于std::set<int>::iterator是双向迭代器,advancenext都可以使用。

答案 1 :(得分:0)

operator +并未为此结构定义,仅对随机访问迭代器有意义。

第一个解决方案: 您可以使用std::advance,该函数会反复使用递增或递减运算符(operator ++或operator--),直到n个元素被推进为止。

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

第二个解决方案: 使用std::nextstd::prev函数,其性能与旧函数相同,因为已经改进了重复使用增加或减少运算符(operator ++或operator--)直到n个元素。

  

注意:如果它是一个随机访问迭代器,则该函数仅使用   一次运算符+或运算符-。

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
  

注意:如果要访问,vectors非常有效地访问其元素(就像数组一样),并且从其末尾添加或删除元素都比较有效。

答案 2 :(得分:-1)

从C ++ 11 std :: set

获取索引元素 C ++中的

std::set没有索引的getter,所以你必须通过自己迭代列表并复制到一个数组然后索引它来自己滚动。

例如:

#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 

} 

或者一个方便的花花公子功能,然后返回正确的:

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); 
}