這個問題並不完全清楚。所以我會給出兩個答案。 (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-25 01:42:02
他在這個例子中顯示的是因爲'3 1 5 2'和'2 1 3 5'包含相同的值,只是不是相同的順序,他們被認爲是重複的,因此被刪除。 – 2012-04-25 02:02:07
在這種情況下,發佈的方法是不正確的,因爲它不排序內部向量。 – devil 2012-04-25 02:06:54