我有一个包含整数值的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 提前感谢
空闲
发布于 2012-04-25 10:03:22
这个问题并不十分清楚。因此,我将给出两个答案。
(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 09:45:05
您可以做的是将每个向量输入到一个列表中,该列表位于以向量的排序值为关键字的映射中,然后遍历映射,选择向量.size()为1的向量。
您的地图将如下所示:
map<vector<int>, vector<vector<int> > > m;插入步骤如下:
m[/*sorted inner_vector*/].push_back(inner_vector);请注意,被推送的inner_vector将保持其原始顺序。
发布于 2016-10-07 06:14:14
如果向量中已经存在一个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.
}
}https://stackoverflow.com/questions/10308204
复制相似问题