STL中“set”元素的直接访问

3

如何直接通过索引访问 STL set 中的元素?

我遇到了错误:no match for 'operator+'

#include<bits/stdc++.h>
..
set < long  long > s;
set <long long > :: iterator it;
it = s.begin() + k;
       cout << (*it);

这里的k是需要元素的索引。

更具体地说,我想使用集合来解决一个问题。

这是问题链接: 第k个因数

这是我的错误代码:

#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
一个集合的元素没有索引,它们是通过键值来获取的。 - jaggedSpire
3
在我看来,这似乎是一个 XY 问题。你想要做什么?请简述一下你的目标。 - HolyBlackCat
3
好的,我会尽力以通俗易懂、准确无误的方式翻译。以下是您需要翻译的内容:不要包含<bits/stdc++.h> - user2672107
可能是 std::set 中的索引或位置 的重复问题。 - P-Gn
为什么?@manni66 - Mohibur Rahman
为什么我不应该#include <bits/stdc++.h>? - Blastfurnace
3个回答

5

为了使这个表达式起作用:

s.begin() + k;

迭代器必须满足随机访问迭代器的概念。如std::set的文档所述,其迭代器是双向迭代器,因此您不能对其添加偏移量。您可以使用的是std::next()

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

但是你需要注意,这会将迭代器 k 次增加。或者你可以将容器更改为提供随机访问迭代器的容器(例如std::vector)。


它没有被执行。我得到了“它不是 'std' 的成员”的错误提示。 - Mohibur Rahman
@MohiburRahman,你应该开始阅读文档,而不是一直期望有人帮你。点击链接查看std::next文档,里面有需要包含的头文件信息。如果你使用的是不支持C++11的旧编译器,可以使用std::advance或简单循环,但最好切换到更好的编译器。有许多免费可用的编译器。 - Slava
非常感谢-- @Slava - Mohibur Rahman

4

std::set拥有双向迭代器。它们不是随机访问迭代器,因此您不能直接跳过任意数量的元素。如果您想从给定迭代器(在此情况下为begin)获取第N个元素,则必须将迭代器向前移动那么多次。幸运的是,有一个名为std::advance的函数可以为您完成这项工作。

试试吧

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

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接