如何通过索引直接访问 STL 设置的元素?
我收到错误与'operator +'不匹配
#include<bits/stdc++.h>
..
set < long long > s;
set <long long > :: iterator it;
it = s.begin() + k;
cout << (*it);
这里k是require元素的索引。
更具体地说,我想用set来解决问题。
这是问题链接: k-th divisor
这是我的错误代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
set<long long> s;
set<long long >:: iterator it;
long long i,n,k, ln;
cin >> n>> k;
ln = sqrt(n);
for(i = 1; i <= ln; i++)
{
if(n%i == 0)
{
s.insert(i);
s.insert(n/i);
}
}
if(s.size() < k)
printf("-1\n");
else
{
it = s.begin() + k;
cout << (*it);
}
s.clear();
return 0;
}
帮帮我
答案 0 :(得分:4)
要使此表达式起作用:
s.begin() + k;
迭代器必须满足RandomAccessIterator概念。如std::set
documentation中所述,其迭代器为BidirectionalIterator,因此您无法为其添加偏移量。您可以使用的是std::next()
:
it = std::next( s.begin(), k );
但你需要知道这会增加迭代器k次。或者您可以将容器更改为提供随机访问迭代器的容器(例如std::vector
)。
答案 1 :(得分:3)
您想要std::next
:
it = std::next(s.begin(), k);
但请注意,随着指数的增加,它变得越来越慢。如果可能的话,你应该尝试不同的方法。
也许你正试图迭代一套?
然后你应该使用
for (long long it : s)
std::cout << it;
或
for (auto it = s.begin(); it != s.end(); it++)
std::cout << *it;
答案 2 :(得分:3)
std::set
有Bidirectional Iterators。它们不是随机访问迭代器,因此不能直接跳过任意数量的元素。如果你想要给定迭代器中的第N个元素(在这种情况下来自begin
),你必须多次推进迭代器。幸运的是,有std::advance
功能可以为您完成。
尝试
it = s.begin();
std::advance(it, k);