拆分向量到唯一和重复c ++

时间:2016-11-07 13:34:09

标签: c++ algorithm sorting split unique

我的目标是将矢量拆分为两部分:具有唯一值和重复项。

例如,我有已排序 vector myVec=(1,1,3,4,4,7,7,8,9,9),应将其分为myVecDuplicates=(1,7,4,9)myVecUnique=(1,4,7,9,3,8).因此,myVecDuplicates包含所有具有重复项的值,而myVecUnique包含所有值但在一个实施例中。

订单无关紧要。我的想法是使用unique,因为它将矢量分成两部分。但我在运行代码时遇到问题。

vector<int> myVec(8)={1,1,3,4,4,7,8,9};
vector<int>::iterator firstDuplicate=unique(myVec.begin(),myVec.end());
vector<int> myVecDuplicate=myVec(firstDuplicate,myVec.end());\\here error accures that says ' no match for call to '(std::vector<int>) (std::vector<int>::iterator&, std::vector<int>::iterator)'
vector<int> myVecUnique=myVec(myVec.begin()+firstDuplicate-1,myVec.end());

运行此代码后,我得到一个错误,说(第二行)'不匹配调用'(std :: vector)(std :: vector :: iterator&amp;,std :: vector :: iterator)'< / p>

请帮助我理解错误的来源,或者建议一些更优雅,更快捷的方法来解决我的问题(没有哈希表)!

4 个答案:

答案 0 :(得分:1)

啊......你的问题中有很多编辑对任何人都喜欢。只需使用地图保持简单。

在C ++中, map 非常方便存储 unique + sorted + adjacent_count 值。

map<int, int> m;
for(auto &t : myVec){
    m[t]++;
}
vector<int> myVecDuplicate, myVecUnique;
for(map<int, int>::iterator it = m.begin(); it != m.end(); it++){
    if(it->second > 1) myVecDuplicate.push_back(it->first);
    myVecUnique.push_back(it->first);
}

修改

  

可能会建议一些更优雅,更快速的方法来解决我的问题(没有哈希表)!

  1. 对矢量
  2. 排序
  3. 遍历已排序的矢量,
  4. 并做

      if (current_value == previous_value){
        if(previous_value != previous_previous_value)
         myVecDuplicate.push_back(current_value);
      }
      else{
          myVecUnique.push_back(current_value);
      }
    

    首先,初始化previous_value = current_value - 1 和previous_previous_value as current_value - 2.

答案 1 :(得分:1)

虽然这可能不赞成(因为没有使用标准算法等),我会写一些这样简单的解决方案:

vector<int> myVec = {1,1,3,4,4,7,8,9};
unordered_set<int> duplicates;
unordered_set<int> unique;

for(int & v : myVec)
{
    if(unique.count(v) > 0)
        duplicates.insert(v);
    else
        unique.insert(v);
}

答案 2 :(得分:1)

std::vector有一个构造函数,它接受2个范围的迭代器[first,second [你不能调用现有对象的构造函数 - 它已经被创建了,所以你的代码

myVec(firstDuplicate,myVec.end());

实际上尝试使用myVec作为仿函数,但std::vector没有operator()因此错误。

你有两种方法,直接将2个迭代器传递给构造函数:

vector<int> myVecDuplicate(firstDuplicate,myVec.end());

或使用临时矢量复制初始化:

vector<int> myVecDuplicate = vector<int>(firstDuplicate,myVec.end());

第二个载体相同:

 vector<int> myVecUnique(myVec.begin(),firstDuplicate);
Logman std::unique指出的

似乎不能保证重复的价值,因此工作解决方案可以使用std::set代替(并且您不必预先设定源向量):

std::set<int> iset;
vector<int> myVecUnique, myVecDuplicate;
for( auto val : myVec )
    ( iset.insert( val ).second ? myVecUnique : myVecDuplicate ).push_back( val );

答案 3 :(得分:1)

O(n)复杂性解决方案:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> myVec = {1,1,3,4,4,7,7,8,9,9};
    std::vector<int> myVecDuplicatec;
    std::vector<int> myVecUnique;

    for(int &x : myVec)
    {
        if(myVecUnique.size() == 0 || myVecUnique.back() != x)
            myVecUnique.push_back(x);
        else
            myVecDuplicatec.push_back(x);
    }

    std::cout << "V = ";
    for(int &x : myVec)
    {
        std::cout << x << ",";
    }
    std::cout << std::endl << "U = ";
    for(int &x : myVecUnique)
    {
        std::cout << x << ",";
    }
    std::cout << std::endl << "D = ";
    for(int &x : myVecDuplicatec)
    {
        std::cout << x << ",";
    }

}

cpp.sh/4i45x