web-dev-qa-db-ja.com

2つのベクトルが等しいかどうかを確認します

2つのベクトルの最初の「n」要素が等しいかどうかを確認するにはどうすればよいですか?

私は次を試しました:

#include <iostream>
#include <vector>
#include <iterator>
using namespace std;

typedef vector<double> v_t;

int main(){
    v_t v1,v2;
    int n = 9;

    for (int i = 1; i<10; i++){
        v1.Push_back(i);
        v2.Push_back(i);
    }
    v1.Push_back(11);
    v2.Push_back(12);

    if (v1.begin()+n == v2.begin()+n)
        cout << "success" << endl;
    else
        cout << "failure" << endl;
}

なぜ「成功」ではなく「失敗」と表示されるのですか?

46
0x0

std::equalヘッダーから <algorithm> 関数を使用します。

if (std::equal(v1.begin(), v1.begin() + n, v2.begin())
  std::cout << "success" << std::endl;

両方のベクトルには、少なくともn要素が必要であることに注意してください。どちらかが短すぎる場合、プログラムの動作は未定義になります。

entireベクトルが他のベクトルと等しいかどうかを確認する場合は、他のものと比較するように比較します。

if (v1 == v2)

あなたの(失敗した)コードは、1つのベクトルのiteratoriterator他の。等しいベクトルの反復子は等しくありません。各反復子は、反復するシーケンスに関連付けられているため、あるベクトルの反復子が別のベクトルの反復子と等しくなることはありません。

131
Rob Kennedy

2つを比較する最も簡単な(検索する非日常関数が最も少ないという点で)方法は、再度ループすることです。

bool are_equal = true;
for (int i = 0; i < first_how_many; i++)
    if (v1[i] != v2[i])
    {
        are_equal = false;
        break;
    }

ほぼ同じことを行いますが、必要に応じて<algorithm>ヘッダーのstd::equal関数: http://www.cplusplus.com/reference/algorithm/equal/

7
Tony Delroy