这个问题并不完全清楚。所以我要给出两个答案。
(1) 如果您想删除重复但保留 1 个副本同时保持myVec
' 的顺序,则需要使用 set。
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
并保留内部向量元素的原始顺序。