1

私はプログラミングの問題を解決していました。それは、2つのセット間の対称差を見つけたいと思っています。STLを使用して解決しましたset_symmetric_difference。私は2つ与えられvector<int>sAそしてB

A = {342,654,897,312,76,23,78}

B = {21,43,87,98,23,756,897,234,645,876,123}

返される(正解):

{21,43,76,78,87,98,123,234,312,342,645,654,756,876}

しかし、私は得ます:

{21,43,76,78,87,98,123,234,312,342,645,65,756,876}

何が問題ですか ?これが私のコードです:

sort(A.begin(), A.end());
sort(B.begin(), B.end());
// allocate the smallest size of A,B as maximum size
vector<int> c(A.size() < B.size() ? B.size() : A.size());
vector<int>::iterator i;
i = set_symmetric_difference(A.begin(), A.end(), B.begin(), B.end(), c.begin());
return vector<int>(c.begin(), i);

注: 残りの例では正しい答えが得られます。この例は私にこの間違った答えを与えるだけです。

Visual Studioでテストしたところ、「イテレータはインクリメントできません」というエラーメッセージが表示されました。

4

2 に答える 2

5

問題はベクトルの初期化にありcます。出力範囲の最大サイズが2つの入力範囲の合計と同じくらい大きくなる可能性があるという点で、ロジックは少し間違っています。事前にサイズがわからないため、空の出力ベクトルから始めて、代わりにstd::back_inserterでpush_backを使用する方がよい場合があります。

sort(A.begin(), A.end());
sort(B.begin(), B.end());
std::vector<int> c;
set_symmetric_difference(A.begin(), A.end(), 
                         B.begin(), B.end(), std::back_inserter(c));
return c;

これにより、

21 43 76 78 87 98123234 312 342645654756876

于 2012-07-07T09:09:01.597 に答える
3

コードを実行すると、ベクトルイテレータからインクリメントできない例外が発生します。問題はここにあると思います:

vector c(A.size() < B.size() ? B.size() : A.size());

私はそれを次のように変更しました:

vector c(A.size() + B.size());

例外なく実行しました。私もあなたが書いたものと同じ番号(正しい番号)を取得します。

于 2012-07-07T09:10:47.947 に答える