0

int のセットに何かを設定しました。長さ 52 の。次のようにサイクルを使用してセットを反復処理しています。

for(iterator A from 1st to 48th element)
 for(iterator B from A+1 to 49th element)
  for(iterator C from B+1 to 50th element)
   for(iterator D from C+1 to 51th element)
    for(iterator E from D+1 to 52th element)
    {
       //save the values from the actual positions in set in array[5]
    }

最初にイテレータで作成しようとしましたが、 からイテレータを開始することはできないことに気付きましたposition of another iterator +1。次に、ポインターを使用して値をジャンプしようとしましたが、最初の値のみを正しく割り当ててから、2 番目などにジャンプできません。

私のコードは次のとおりです。

set<int> tableAll;
for(int i=4; i!=52; ++i) 
  tableAll.insert(i);

const int * flop1 = & * tableAll.begin();
cout << * flop1 << endl;
flop1++;
cout << * flop1 << endl;

coutpointer の値をflop1取得すると 4 になり、それで問題ありませんが、それを増やして再びcout画面に表示すると、0、次に 49、次に 0、次に 1、次に 0 の代わりに 5、6、7、8、および 9 になります。 .

では、セットを正しく反復処理するにはどうすればよいでしょうか? ポインターを使用すると、イテレーターのソリューションよりも高速になると思います。

4

3 に答える 3

4

別のイテレータからのオフセットから絶対に反復できます。

for (auto a(std::begin(mySet)), a_end(std::prev(std::end(mySet), 4));
        a != a_end; ++a)
    for (auto b(std::next(a)), b_end(std::next(a_end); b != b_end; ++b)
        ...

C ++ 03では、互換性のために次のようnextに記述できます。begin

template<typename Iterator> Iterator next(Iterator it, int n = 1) {
    std::advance(it, n);
    return it;
}

template<typename Iterator> Iterator prev(Iterator it, int n = 1) {
    std::advance(it, -n);
    return it;
}

for (std::set<int>::const_iterator a(mySet.begin()),
        a_end(std::prev(mySet.end(), 4)); a != a_end; ++a)
    for (std::set<int>::const_iterator b(std::next(a)),
            b_end(std::next(a_end)); b != b_end; ++b)
        ...
于 2012-09-10T15:02:12.750 に答える
1

このコードは、不要なイテレータ比較を行うため最適ではありませんが、機能し、単純に次のようになります。

set<int> tableAll;
for(int i=0; i!=52; ++i)
  tableAll.insert(i);

for( set<int>::iterator iA=tableAll.begin(); iA != tableAll.end(); ++iA  )
    for( set<int>::iterator iB=iA; ++iB != tableAll.end();  )
        for( set<int>::iterator iC=iB; ++iC != tableAll.end();  )
            for( set<int>::iterator iD=iC; ++iD != tableAll.end();  )
                for( set<int>::iterator iE=iD; ++iE != tableAll.end();  ) 
{
   cout<<*iA<<' '<<*iB<<' '<<*iC<<' '<<*iD<<' '<<*iE<<endl;
}
于 2012-09-10T15:19:17.600 に答える
0

setを一時的にコピーすることをお勧めしますstd::vector。ループで行うすべての操作は、ベクトルとO(1)にとって自然なことです(もちろんループ自体を除く)。これは、読み取りと書き込みが簡単で、実行速度が大幅に向上するはずです。

于 2012-09-10T16:04:22.597 に答える