2012-04-25 69 views
1

我有一个包含整数值的STL向量的STL向量。一些内部向量是重复的,但它们的元素顺序不一样。现在,我想获得一个矢量矢量而不需要任何重复的内部矢量。我已经看到了下面的方法:删除STL向量中的重复STL向量

std::vector<std::vector<int>> myVec; 
std::sort(myVec.begin(), myVec.end()); 
myVec.erase(std::unique(myVec.begin(), myVec.end()), myVec.end()); 

的问题是,我想eleminate重复保持每个顺序的元素的顺序(原始订单或者不对它进行排序),什么是做到这一点的最好办法?有另一种方式更有效吗?

例子:

1 6 4 5 
3 1 5 2----> result of elimination: 1 6 4 5 
2 1 3 5        3 1 5 2 

在此先感谢

vacing

+2

我不明白你的榜样,但也许这只是我。 – 2012-04-25 01:42:02

+1

他在这个例子中显示的是因为'3 1 5 2'和'2 1 3 5'包含相同的值,只是不是相同的顺序,他们被认为是重复的,因此被删除。 – 2012-04-25 02:02:07

+0

在这种情况下,发布的方法是不正确的,因为它不排序内部向量。 – devil 2012-04-25 02:06:54

回答

2

这个问题并不完全清楚。所以我会给出两个答案。 (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元素的顺序,并保留在所述内矢量元素的原始顺序。这里

+0

差不多,但从这个例子看来,海报似乎并不想包含任何有重复项目的项目(而你正在筛选出多余的副本)。 – jamesdlin 2012-04-25 02:49:37

+0

我明白了,在这种情况下,我们需要一个计数器。将编辑。 – devil 2012-04-25 06:05:55

+0

非常感谢! – user1310873 2012-04-25 08:16:23

1

你可以做的是进入每个向量到这是在年代由载体和排序的值键控地图列表然后通过地图选择矢量.size()为1的地图。

您的地图将如下所示:

map<vector<int>, vector<vector<int> > > m; 

插入如下:

m[/*sorted inner_vector*/].push_back(inner_vector); 

注意,被推inner_vector保持其原始顺序。

+0

对不起,我犯了一个错误,我编辑了这个例子。在这种情况下,魔鬼选项1对我有好处,谢谢。 – user1310873 2012-04-25 07:19:38

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. 
       } 
      }