2017-06-29 11 views
2

の要素に直接アクセスする方法STLをインデックスで直接アクセスするにはどうすればいいですか?STLの要素への直接アクセス

私はエラーを得た'演算子+'

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

のための一致は、ここでkは必要要素のインデックスではありません。

より具体的には、私は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; 
} 

はあなたがstd::nextをしたい

+3

セットの要素は索引付けされません。彼らは鍵で見つけられる。 – jaggedSpire

+3

私に[XY problem](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

ありがとう〜@スラヴァ –

3

を私を助け:

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

私は@ Sneftel –

関連する問題