首页 > 解决方案 > 在保留顺序函数的同时删除向量中的重复项的逻辑错误

问题描述

void vectorDeduplicator(std::vector<std::string>& inputVector){ 
     for(int i = 0; i < inputVector.size() - 1; i++){
          for(int x = 1; x <= inputVector.size() - 1; x++)
                if(inputVector.at(i) == inputVector.at(x) && i != x){
                inputVector.erase(inputVector.begin() + x);    
          }
     }
}
Input: 1 1 2 2 4 4 3 3 1 1 3 3 3 2 2
Output: [1,2,4,1,3,2]

您可以看到我试图用来删除vector内的重复项的函数。它在重复项相邻时起作用。我不想在不知道标准库或其他任何东西中已经存在的任何东西的情况下使用更快、更有效的方法。我想学习它背后的算法,因为这是出于学习目的。

标签: c++vectorduplicates

解决方案


问题是您在擦除时忽略了一个值。你需要减少 x:

#include <vector>
#include <iostream>

void vectorDeduplicator(std::vector<int>& inputVector)
{ 
     for(int i = 0; i < inputVector.size() - 1; i++)
     {
          for(int x = 1; x < inputVector.size(); x++)
          {
                if(inputVector.at(i) == inputVector.at(x) && i != x)
                {
                    inputVector.erase(inputVector.begin() + x);
                    x--; // go one back because you erased one value
                }
          }

        // to debug
        for(const auto& x : inputVector)
            std::cout << x << " ";
        std::cout << std::endl;
     }
}

int main(){

    std::vector<int> vector{1, 1, 2, 2, 4, 4, 3, 3, 1, 1, 3, 3, 3, 2, 2};

    vectorDeduplicator(vector);

    // output
    for(const auto& x : vector)
        std::cout << x << " ";
    

    return 0;
}

那么输出是:

1 2 2 4 4 3 3 3 3 3 2 2 
1 2 4 4 3 3 3 3 3 
1 2 4 3 3 3 3 3 
1 2 4 3 
1 2 4 3 

推荐阅读