我有一组类型set<int>
,我希望得到一个不是开头的迭代器。
我正在做以下事情:
set<int>::iterator it = myset.begin() + 5;
我很好奇为什么这不起作用,将迭代器放到我想要的地方的正确方法是什么。
答案 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
是双向迭代器,advance
和next
都可以使用。
答案 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::next或std::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)
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);
}