c++ - 在保留顺序函数的同时删除向量中的重复项的逻辑错误
问题描述
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内的重复项的函数。它在重复项相邻时起作用。我不想在不知道标准库或其他任何东西中已经存在的任何东西的情况下使用更快、更有效的方法。我想学习它背后的算法,因为这是出于学习目的。
解决方案
问题是您在擦除时忽略了一个值。你需要减少 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
推荐阅读
- angular - 基于组件的编码(使用 Angular 7)
- c# - 接受 Func 的简单超时方法
没有等待 - tensorflow - tensorflow keras 评估函数
- azure - Azure 活动目录租户 ID
- swift - 在 swift 函数中显示和隐藏 MBprogressHUD 乘法次数
- java - OAuth2 身份验证:Java 更新后的序列化类不兼容
- elasticsearch - 是否可以在 ElasticSearch 中禁用操作系统信息?
- node.js - Hyperledger Fabric 1.4:如何注册链码发出的事件?
- c++ - std::regex 构造函数安全吗?
- python-2.7 - 如何过滤SSD检测器中检测到的对象?