我正在尝试编写一个程序,该程序在不更改值顺序的情况下删除数组中的所有重复值。输出应如下所示:
5 3 7 1 7 7 2 3 5 5
5 3 7 1 2
但是在我的程序中,重复值已被删除的新数组无法打印。
这是我的代码:
#include <iostream>
using namespace std;
int unique(int array[], int n) {
if (n==0 || n==1)
return n;
int temp[n];
int j = 0;
int i = 0;
for(i = 0; i < n -1; i++)
if (array[i] != array[i+1])
temp[j++] = array[i];
temp[j++] = array[n-1];
for(i = 0; i < j; i++)
array[i] = temp[i];
return j;
}
int main() {
int array[10];
int n, i;
for(int i = 0; i < 10; i++)
cin >> array[i];
int size = unique(array, n);
if(size < 0 || size > 10)
return -1;
for(int size = 0; i < size; i++) {
cout << array[i] << " ";
}
cout << endl;
return 0;
}
编辑:在收到有关数组的约束和大小的一些建议之后,我对代码进行了重新设计。我还取消了temp
的使用,因为它不是正确的C ++。这是新代码:
#include <iostream>
using namespace std;
int unique(int array[]) {
int size = 10;
int i, j, k;
for(i = 0; i < size; ++i)
for(j = i + 1; j <size;){
if(array[i]==array[j]){
for( k = j; k<size-1;++k)
array[k]=array[k+1];
--size;
}
else
++j;
}
return size;
}
int main() {
int array[10];
for(int i = 0; i < 10; i++)
cin >> array[i];
int size = unique(array);
if(size < 0 || size > 10)
return -1;
for(int i = 0; i < size; i++) {
cout << array[i] << " ";
}
cout << endl;
return 0;
}
答案 0 :(得分:1)
首先从数组中删除元素意味着需要调整其大小,因此最好使用向量。
基本思想是这个
编辑:
正如PaulMckenzie所建议的那样,最好使用std :: unordered_set,在这种情况下是正确的,因为在这种情况下只需要键就不需要值
答案 1 :(得分:1)
您应该使用std::vector
而不是数组,或者如果知道编译时元素的数量,请使用std::array
。这是一个适用于数组或任何STL容器的解决方案(进行了一些小的语法修改,即使用std::begin
和std::end
):
int unique(int *arr, int n)
{
auto end = arr + n;
for (auto begin = arr; begin != end; ++begin)
end = std::remove(begin + 1, end, *begin);
return end - arr;
}