2016-11-07 63 views
1

我的目标是将一个向量拆分为两部分:具有唯一值和重复项。拆分向量以独特和重复C++

例如我已经排序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包含的所有值,但是在单个实施例。

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

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

运行此代码后,我得到一个错误,指出(第2行) '敌不过呼叫'(标准::向量)(的std ::矢量::迭代器&,性病::矢量::迭代器)'

请帮助我了解错误的来源或者可能提出一些更优雅和快速的方法来解决我的问题(无散列表)!

+0

你需要为std ::在使用std :: unique之前排序vector。获取重复项有点复杂。 –

+0

我运行代码的向量是排序的 – Bogdan

+0

唯一不删除所有重复项,但只有连续的。要么你必须先排序或以不同的方式执行 – user463035818

回答

1

啊..在你的问题中对任何人都喜欢的许多编辑。只需使用地图即可。

在C++中,地图进来存储独特+非常方便的整理+ 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.

+0

请不要阻止用户改进他们的问题。 – Bathsheba

+0

改变是正确的..但他改变了输出样本本身.. –

+4

@Bathsheba除非问题以这样的方式编辑,使现有的答案无效。 –

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

**皱眉加剧** –

1

std::vector具有接受2个迭代器范围[第一,第二构造函数[你不能调用构造函数现有对象 - 它已经建立,因此您的代码

myVec(firstDuplicate,myVec.end()); 

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

你有2种方式,通过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); 
+0

这正是我所需要的。非常感谢你!但我会将萨拉夫的答案标记为最好的,因为它大部分满足问题的正式方面。 – Bogdan

+1

@Bogdan在firstDuplicate迭代器包含未指定的数据之后,此解决方案的工作严重依赖于'myVec'的独特实现。防爆。 v == {1,2,2,3},唯一(v),v == {1,2,3,3}并且不期望v == {1,2,3,2} – Logman

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