分割向量到唯一的和重复的c++

Split vector to unique and duplicates c++

本文关键字:c++ 分割 唯一 向量      更新时间:2023-10-16

我的目标是将一个向量分成两部分:具有唯一值和重复值。

例如,我有排序 vector myVec=(1,1,3,4,4,7,7,8,9,9),它应该分为myVecDuplicates=(1,7,4,9)myVecUnique=(1,4,7,9,3,8).,所以myvecduplicate包含所有有重复的值,而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&, std::vector::iterator) ` `

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

啊…你的问题中有太多的编辑,任何人都不喜欢。通过使用map保持简单。

在c++中,map在存储unique + sorted + respective_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. 遍历排序向量,

  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为current_value - 2

虽然这可能会让人皱眉(因为没有使用标准算法等),但我会写一些简单的解决方案,像这样:

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);
}

0 (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/4 i45x

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

myVec(firstDuplicate,myVec.end());

实际上试图使用myVec作为函子,但std::vector没有operator(),因此出现错误。

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

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

或使用拷贝初始化临时vector:

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 );