1

整数値を含むSTLベクトルのSTLベクトルがあります。一部の内部ベクトルは重複していますが、要素の順序は同じではありません。ここで、内部ベクトルが重複しないようにベクトルのベクトルを取得したいと思います。私は次の方法を見てきました:

std::vector<std::vector<int>> myVec;
std::sort(myVec.begin(), myVec.end());
myVec.erase(std::unique(myVec.begin(), myVec.end()), myVec.end());

問題は、各順序の要素の順序(元の順序または並べ替えなし)を維持しながら重複を排除したいということですが、これを行うための最良の方法は何ですか?より効率的な別の方法はありますか?

例:

1 6 4 5
3 1 5 2----> result of elimination: 1 6 4 5
2 1 3 5                             3 1 5 2  

前もって感謝します

退去

4

3 に答える 3

2

質問は明確ではありません。というわけで、2つ回答させていただきます。

(1) の順序を維持したまま、重複を削除し、1 つのコピーを保持myVecする場合は、セットを使用する必要があります。

std::vector< std::vector<int> > myVec;
//or std::unordered_set if you expect mostly unique sorted inner vectors
std::set< std::vector<int> > exists; 
std::vector< std::vector<int> > tmpVec;

for (std::size_t i=0, N=myVec.size(); i<N; ++i)
{
    std::vector<int> key(myVec[i]);
    std::sort(key.begin(), key.end());
    if (exists.find(key) == exists.end())
    {
        exists.insert(key);
        tmpVec.push_back(std::vector<int>());
        std::swap(myVec[i], tmpVec.back());
     }
}

std::swap(tmpVec, myVec);

(2) 複数回出現するすべての要素を削除したい場合はmyVec、カウンターのマップが必要です。

std::vector< std::vector<int> > myVec;
//or std::unordered_map if you expect mostly unique sorted inner vectors
std::map< std::vector<int>, unsigned > counters; 

// first loop to count
for (std::size_t i=0, N=myVec.size(); i<N; ++i)
{
    std::vector<int> key(myVec[i]);
    std::sort(key.begin(), key.end());
    ++counters[key];
}

// second loop to filter
std::vector< std::vector<int> > tmpVec;
for (std::size_t i=0, N=myVec.size(); i<N; ++i)
{
    std::vector<int> key(myVec[i]);
    std::sort(key.begin(), key.end());
    if (counters[key] == 1)
    {
        tmpVec.push_back(std::vector<int>());
        std::swap(myVec[i], tmpVec.back());
     }
}

std::swap(tmpVec, myVec);

どちらのソリューションも要素の順序を尊重myVecし、内部ベクトルの要素の元の順序を保持します。

于 2012-04-25T02:03:21.713 に答える
1

あなたができることは、ベクトルのソートされた値によってキー付けされたマップ内のリストに各ベクトルを入力し、ベクトル.size()が 1 のものを選択してマップを反復処理することです。

マップは次のようになります。

map<vector<int>, vector<vector<int> > > m;

挿入は次のとおりです。

m[/*sorted inner_vector*/].push_back(inner_vector);

inner_vectorプッシュされる は元の順序を維持することに注意してください。

于 2012-04-25T01:45:04.890 に答える
0

intベクトル内に がすでに存在する場合、これはユーザーに警告します。

    using namespace std;
    int num, prev; 

    cout << "Number: "; cin >> num;

            vec.push_back(num);
            sort(vec.begin(), vec.end());
            for (size_t i = 0; i < vec.size()-1; ++i)
            {
                prev = vec[i];
                if (prev == num)
                {
                    cout << "Duplicated\n"; // or whatever.
                    vec.erase(vec.begin() + i); // Delete the duplicated value.
                }
            }
于 2016-10-06T22:14:13.940 に答える