0

この問題では std::vector のみを使用しており、各ベクトルは重複せずに並べられています。今、同じ番号を持つベクトルを結合したいと思います。したがって、2 3 は 3 4 5 と結合できますが、4 5 や 1 5 と結合することはできません。

例:

次のベクトルがある場合...

1
1
2 3 4
5
1 5
2
4 7

結合後、2 つのベクトルしか残らないはずです。

1 5
2 3 4 7

コード:

vector<int> a,b,c,d,e,f,g;
vector<vector<int>> myList;

a.push_back(1);
b.push_back(1);
c.push_back(2);
c.push_back(3);
c.push_back(4);
d.push_back(5);
e.push_back(1);
e.push_back(5);
f.push_back(2);
g.push_back(4);
g.push_back(7);

myList.push_back(a);
myList.push_back(b);
myList.push_back(c);
myList.push_back(d);
myList.push_back(e);
myList.push_back(f);
myList.push_back(g);

//this should print out the vectors in my above example
for (int i =0; i<myList.size(); i++) {
    for (int j=0; j<myList[i].size(); j++) {
        cout<<myList[i][j]<<" ";
    }
    cout<<endl;
}

目標を達成するために set_union と set_intersection を使用しようとしましたが、期待どおりに動作しません。問題は、適切に変更していないベクトルのサイズにあると思われます。助けてください。ありがとう!

編集:

これはバグのあるコードです。元々はユニオンに問題がありましたが、今は自動的に機能します.. set_intersection を使用して交差があるかどうかを確認する方法がほとんどわからないと思います

vector<int>::iterator myIt;
vector<int> myTemp;
vector<int> myTemp2;
vector<int> myResult(20);
vector<int> myResult2(20);


while (!myList.empty()) {

    myTemp2 = myList.back();
    myList.pop_back();


    myIt = set_intersection(myTemp.begin(), myTemp.end(), 
                            myTemp2.begin(), myTemp2.end(), myResult.begin());

    //this is checking whether there is intersection but it doesn't work
    if (myResult.size()) {

        myIt = set_union(myTemp.begin(), myTemp.end(), 
                         myTemp2.begin(), myTemp2.end(), myResult2.begin());

        myTemp = myResult2;

    }


}

cout<<"after union: "<<endl;

for (auto it = myResult2.begin(); it != myResult2.end() ; it++) {
    cout<<*it<< " ";
}
4

2 に答える 2

1

これは完璧ではありません

vector<int> myResult(20);

myIt = set_intersection(myTemp.begin(), myTemp.end(), 
     myTemp2.begin(), myTemp2.end(), myResult.begin());

問題は、set_intersection (および set_union) がベクトルのサイズを変更しないことです。myResult のサイズを 20 にすることで、十分なスペースを確保できますが、交差を行った後でもサイズ 20 のベクトルになってしまうためmyResult.size() == 20、2 つのベクトルに含まれる要素はすべて開始する必要があります。

必要なのは、set_intersection を使用して要素を宛先ベクトルに追加する方法です。そのために必要なback_inserter

#include <iterator>

vector<int> myResult;

set_intersection(myTemp.begin(), myTemp.end(), 
    myTemp2.begin(), myTemp2.end(), 
    back_inserter(myResult));

back_inserterを使用して要素をベクターに追加するpush_backため、 myResult はサイズ 0 から開始し、交差点にある要素の数に応じて正しいサイズになります。したがってmyResult.size() > 0、共通の要素があるかどうかをテストするだけです。

set_union を呼び出すときにも同じことを行います。

于 2013-04-10T22:51:29.970 に答える