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

这个问题并不完全清楚。所以我要给出两个答案。

(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并保留内部向量元素的原始顺序。

于 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 回答