2017-06-29 59 views
2

如何直接访问STL集合的元素索引?直接访问STL“set”元素

我的错误敌不过 '运营商+'

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

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

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

这里的问题是链接: 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

集合中的元素未被编入索引。它们是按键找到的。 – jaggedSpire

+3

看起来像[XY问题](http://xyproblem.info/)给我。你想做什么? – HolyBlackCat

+3

不包含

回答

4

对于这个表达式工作:

s.begin() + k; 

迭代器必须满足RandomAccessIterator概念。如std::set documentation中所述,其迭代器为BidirectionalIterator,因此您无法向其添加偏移量。你可以使用是std::next()

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

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

+0

它不工作。我得到**它不是'std'的成员** –

+0

@MohiburRahman你应该开始阅读文档,而不是期待保姆的所有时间。点击'std :: next'文件的链接,那里有需要包含哪些标题的信息。如果使用不支持C++ 11的旧编译器,则可以使用'std :: advance'或简单循环,但更好地转换为更好的编译器。有很多是免费使用的。 – Slava

+0

非常感谢 - @Slava –

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; 
3

std::setBidirectional Iterators。它们不是随机访问迭代器,所以不能直接跳过任意数量的元素。如果你想要一个给定的迭代器中的第N个元素(在这种情况下为begin),你必须多次提前迭代器。幸运的是,std::advance函数可以帮你实现。

尝试

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

I编辑我的帖子澄清。@ Sneftel –