从向量c ++的向量中删除重复元素

时间:2017-09-10 15:23:13

标签: c++ vector iterator

我试图从较大的矢量中删除重复项目 例如:

6 11  
7 8
6 16 17

我应该得到:

6 11  
7 8
16 17

我有什么:

vector<vector<int>>B;
vector<vector<int>>::iterator b_list;
vector<vector<int>>::iterator b_it;
vector<int>::iterator b_list_it;
vector<int>::iterator b_it_it;
for (b_list = B.begin(); b_list != B.end()-1; ++b_list)
{
    for (b_it = b_list+1; b_it != B.end(); ++b_it)
    { 
        for (int i = 0; i < (*b_list).size(); ++i)
        {
            for (int j = 0; j < (*b_it).size(); ++j)
            {
                if ((*b_list)[i] == (*b_it)[j])
                {
                    if ((*b_list).size() > (*b_it).size())
                        {   
                            (*b_list).erase((*b_list).begin());
                        }
                        if ((*b_list).size() < (*b_it).size())
                        {
                            (*b_it).erase((*b_it).begin());
                        }
                }
             }
         }
     }
}

在这种情况下,erase()不会删除任何内容。为什么会这样?什么可以用来代替呢?

谢谢!

4 个答案:

答案 0 :(得分:5)

使用STL工具,您可以更轻松地完成此操作

vector<int> vec{1,2,3,5,2,3,8};
set<int> s(vec.cbegin(), vec.cend());
vec = vector<int>(s.cbegin(), s.cend());

我很确定这会比你想出的任何算法都更有效。

答案 1 :(得分:1)

您可以使用&#34; unique&#34;返回被删除的最后一个元素的位置的函数。 &#34;独特&#34;函数删除所有出现的事件,只留下一个实例。

一个例子是:

vector<int>::iterator it;
vector<int> nums = {1, 2, 3, 5, 2, 1};

std::sort(nums.begin(), nums.end()); //sort ascending
it = std::unique(nums.begin(), nums.end()); //remove occurrences

nums.resize(std::distance(nums.begin(), it)) //resize to remove missing empty slots in container

for(auto num : nums){
   std:cout<< num;
}

输出为1235

答案 2 :(得分:1)

由于OP具有二维向量。 不确定OP是否希望排序数据(在这种情况下可以使用唯一) 但是假设他们没有按照一组进行排序被用作跟踪器。 跟踪独特的价值观。 if (ret.second!=false)             fogRow.push_back(s);复制向量用于每次在

中推送唯一值的位置
//
//  main.cpp
//  ranged
//
//  Created by Hariom Singh on 9/9/17.
//  Copyright © 2017 Hariom Singh. All rights reserved.
//

#include <iostream>
#include <string>
#include <vector>
#include <set>

int main() {
    std::vector<std::vector<int> >  val {{6,11},{7,8},{6,16,17}};
    std::vector<std::vector<int> >  uniquevalcopy;
    std::set<int> tracker;
    for ( const auto &row : val )
    {
        std::vector <int> fogRow;
        for ( const auto &s : row )
        {
            std::cout << s << ' ';
            auto ret = tracker.insert(s);
            if (ret.second!=false)
            fogRow.push_back(s);

        }
        uniquevalcopy.push_back(fogRow);
        std::cout << std::endl;
    }

    std::cout<<"after removal"<<"\n";
    for ( const auto &row : uniquevalcopy )
    {
        for ( const auto &s : row )
        {
            std::cout << s << ' ';

        }
        std::cout << std::endl;
    }
    return 0;
}

输出

6 11 
7 8 
6 16 17 
after removal
6 11 
7 8 
16 17 
Program ended with exit code: 0

答案 3 :(得分:0)

在vector :: erase()调用之后,你不能使用迭代器引用超出删除位置

看看,例如here

  

指向位置和超出位置的迭代器,指针和引用都是无效的,所有迭代器,指针和对位置之前元素的引用都保证在调用之前保持引用它们所引用的相同元素。