0

2 つのループの順序を変更する方法を考えています。ここに 2 つのリストがあります。

list<element> aList1;
list<element> aList2;

両方のリストの各要素をチェックして、aList1 の要素が aList2 の要素と等しいかどうかを確認します。

リストの内容は次のとおりです。

<a,b,c,d> aList1
<k,a,b,z> aList2

そのため、結果は aList1 の一致しない位置 3 ~ 4 を記録する必要があります。

ただし、コンテンツは次の場合もあります。

<a,b,c>
<d,d,b,d>

そのため、結果は一致しない位置 1 ~ 2 および 4 を aList1 に記録する必要があります。aList1 の位置だけに注目します。

もう一つ:

<a,b,c,d,e,f>
<z,e,f,g>

リストの長さは異なる場合があり、一致した要素は位置 5 ~ 6 で一致します。

これを行うために for(aList1){for(aList2){}} を使用しましたが、多くの無駄がありました。それを行うための良い方法を教えてください。どうもありがとう!

リストだけでなく、コンテナーはベクトル、マップにもできます。

PS: 要素は非常に複雑で、0 または 1 ではなく、実際にはポインターです (各要素にはいくつかの要素が含まれているため、1 つずつ比較する必要があるため、すべてをループするよりも少ない要素を比較したいのです)。

4

3 に答える 3

1

ネストされたループを避けたい場合は、次のようにしてください。

for (auto aIt = a.begin(), bIt = b.begin(); aIt != a.end() && bIt != b.end(); ++aIt, ++bIt)

于 2013-06-06T18:43:22.323 に答える
0

リストを並べ替えることができる場合は、両方を並べ替えて、1 つのループ ( O(N log N) ) で 2 つのポインターで比較します。

異なる値の数が少ない場合 (たとえば、0 と 1 のみの場合 - 2 つの異なる数値)、各数値のカウント (例では 0 と 1 の数) を計算し、結果を確認できます。( オン) )

数値 (インデックスなど) をリストの要素に関連付けることができれば、std::bitset を効果的に使用できます。より複雑ですが、高性能です。これを見て、操作AND。

それでも、std::set_intersectionを見てください。これは非常に明快でシンプルで、実際にはポインターでも機能します。

于 2013-06-06T18:44:24.157 に答える