这个问题并不完全清楚。所以我会给出两个答案。 (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