有些场景下 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 circlej = -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;
}