【204】C++的vector删除重复元素
有些场景下 vector 中会有重复元素,而业务要求 vector 中避免出现重复元素。
我的算法如下:
- 获取当前 vector 的元素数量,并保存到一个 int 类型变量中。
- 开启一个外部循环,把 vector 从后向前循环,循环范围是最后一个到正数第二个,获取当前元素。
- 开启一个内部循环。从当前 vector 索引向前循环到第一个元素,获取排在前面的元素。
- 如果前面的元素中有和当前元素相等的,就删除当前元素,并终止内部循环。如果没有,就让内部循环继续运行直到结束。
- 重复第一步,直到外部循环结束。
因为在代码执行过程中,vector 的元素数量有可能变少,所以需要提前保存 vector 的元素数量。
从后向前循环,是为了保证在删除元素的时候,索引不会被影响并且能正确访问 vector 的元素。从前向后的话索引就无法保证能正确访问 vector 的元素了。
下面是以 int 整型为例自的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
int main(int argc, char** argv) {
system("color 02");
printf("argc=%d, argv=%s\n", argc, argv[0]);
// Prepare the vector and the datas.
const int LENGTH = 12;
int arr[LENGTH] = { 1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 7 };
// int arr[LENGTH] = { 12, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1 };
std::vector<int> intVector;
for (int i = 0; i < LENGTH; i++) {
intVector.push_back(arr[i]);
}
// Print vector content.
printf("Before delete repeat:\n");
for (std::vector<int>::iterator it = intVector.begin(); it != intVector.end(); it++) {
int item = *it;
printf("%d ", item);
}
printf("\n");
// Delete the repeat item.
int size = intVector.size();
for (int i = size - 1; i >= 1; i--) {
int current = intVector[i];
// 查找前面一个重复的元素并删除。每次只删除一个
for (int j = i - 1; j >= 0; j--) {
int previous = intVector[j];
if (current == previous) {
intVector.erase(intVector.begin() + i);
// Stop the 'j' for circle
j = -1;
}
} // end for (int j = i - 1; j >= 0; j--)
}
// Print vector content.
printf("Print vector content:\n");
for (std::vector<int>::iterator it = intVector.begin(); it != intVector.end(); it++) {
int item = *it;
printf("%d ", item);
}
printf("\nEnd.\n");
return 0;
}