リストのDiffを取る。

二つのリストA、Bの要素のDiffを取って、
Bに無い要素は−リストに、Aに無い要素は+リストに追加する処理。
要素がソート済みな事が条件になっちゃいますが。


#include 
#include
#include

int main()
{
std::vector A;
std::vector B;

A.push_back(0);
A.push_back(1);
A.push_back(2);
A.push_back(3);
A.push_back(5);
A.push_back(6);
A.push_back(8);

B.push_back(1);
B.push_back(2);
B.push_back(4);
B.push_back(5);
B.push_back(6);
B.push_back(7);
B.push_back(8);
B.push_back(9);

std::sort(A.begin(), A.end()); // ソート済みでないとDiffれない。
std::sort(B.begin(), B.end());

int a = 0, b = 0;
std::vector M; // -リスト
std::vector P; // +リスト
while (true) {
if (a == A.size() && b == B.size()) {
break; // 終了
}
if (a == A.size()) {
// 残りのBの要素は無条件に+リストに追加。
P.push_back(B[b]);
++b;
continue;
}
if (b == B.size()) {
// 残りのAの要素は無条件に-リストに追加。
M.push_back(A[a]);
++a;
continue;
}
if (A[a] == B[b]) {
// 同じ値の要素はスルー。
++a; // Aは次の要素に移る
++b; // Bも次の要素に移る
continue;
}
if (A[a] < B[b]) {
// Aの要素が小さい場合は、Bには無い要素と判断出来るので−リストに追加する。
M.push_back(A[a]);
++a; // Aは次の要素に移る
continue;
}
if (A[a] > B[b]) {
// Bの要素が小さい場合は、Aには無い要素と判断出来るので+リストに追加する。
P.push_back(B[b]);
++b; // Bは次の要素に移る
continue;
}
}

printf("A : ");
for (int i = 0; i < A.size(); ++i) {
printf("%d, ", A[i]);
}
printf("\n");

printf("B : ");
for (int i = 0; i < B.size(); ++i) {
printf("%d, ", B[i]);
}
printf("\n");

printf("- : ");
for (int i = 0; i < M.size(); ++i) {
printf("%d, ", M[i]);
}
printf("\n");

printf("+ : ");
for (int i = 0; i < P.size(); ++i) {
printf("%d, ", P[i]);
}
printf("\n");

return 0;
}


実行結果

 A : 0, 1, 2, 3, 5, 6, 8,
B : 1, 2, 4, 5, 6, 7, 8, 9,
- : 0, 3,
+ : 4, 7, 9,
続行するには何かキーを押してください . . .
なんでこうなるか理由も書きたいんだけどうまく言葉に出来ないので
図を書いて試してみようー。

※vectorじゃなくてset使えばsortしなくていいですね(^^;