直接访问STL“set”元素

时间:2017-06-29 20:47:50

标签: c++ stl iterator set

如何通过索引直接访问 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;
}

帮帮我

3 个答案:

答案 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::setBidirectional Iterators。它们不是随机访问迭代器,因此不能直接跳过任意数量的元素。如果你想要给定迭代器中的第N个元素(在这种情况下来自begin),你必须多次推进迭代器。幸运的是,有std::advance功能可以为您完成。

尝试

it = s.begin();
std::advance(it, k);