C++ 从C+中的数组中删除重复项+;
我试图编写一个程序,删除数组中的任何重复值,而不改变值的顺序。输出应如下所示:C++ 从C+中的数组中删除重复项+;,c++,C++,我试图编写一个程序,删除数组中的任何重复值,而不改变值的顺序。输出应如下所示: 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]
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;
}
首先从数组中删除元素意味着需要调整其大小,因此最好使用向量 基本思想是这样的
正如PaulMckenzie所建议的,最好使用std::unordered_set,这在本例中是正确的,因为在本例中不需要值,只需要键。首先从数组中删除元素意味着需要调整其大小,因此最好使用向量 基本思想是这样的
正如PaulMckenzie所建议的,最好使用std::unordered_set,这在本例中是正确的,因为在本例中不需要值,只需要键,您应该使用
std::vector
而不是数组,或者如果您知道编译时的元素数,则使用std::array
。下面是一个适用于数组或任何STL容器的解决方案(只需稍作语法修改,即使用std::begin
和std::end
):
您应该使用
std::vector
而不是数组,或者如果您知道编译时的元素数,那么应该使用std::array
。下面是一个适用于数组或任何STL容器的解决方案(只需稍作语法修改,即使用std::begin
和std::end
):
if(array[i]!=array[i+1])
——如果数字不相邻,该如何检测重复项?我认为您需要重新思考逻辑,可能需要使用不同的数据结构来“记住”已经看到的值。例如:[8 1 2 3 4 5 8]
--如何检测到8
是重复的?@PaulMcKenzie即使数字紧挨着,它也不会打印任何东西,但你是对的。因为我是初学者,我不知道如何使用<代码> STD::向量TEMP(n)< /C>。使用C++代码:STD::Vector <代码>是C++中动态数组的实现方式。第二件事是您的逻辑是错误的——您从unique
返回的值决定了要打印的数量(size
变量)。为什么不从unique
打印返回值以查看将打印多少?如果为0或更小,不要感到惊讶。因此,您需要首先让unique
的逻辑工作。此外,初学者C++也不会得到这些问题——这听起来像是一个在线编码网站的问题。@ PaulMcKeZie你是正确的,它直接打印出0,当我直接打印什么代码>独特< <代码>返回。<代码>为(int大小=0;i<大小;i++)<代码>。你觉得有什么不对劲吗?另外,它是只有10个数字,还是数组可以是任意大小的?数字的最大数量是多少?如果(数组[i]!=数组[i+1])
——如果数字不相邻,如何检测重复的数字?我认为您需要重新思考逻辑,可能需要使用不同的数据结构来“记住”已经看到的值。例如:[8 1 2 3 4 5 8]
--如何检测到8
是重复的?@PaulMcKenzie即使数字紧挨着,它也不会打印任何东西,但你是对的。因为我是初学者,我不知道如何使用<代码> STD::向量TEMP(n)< /C>。使用C++代码:STD::Vector <代码>是C++中动态数组的实现方式。第二件事是您的逻辑是错误的——您从unique
返回的值决定了要打印的数量(size
变量)。为什么不从unique
打印返回值以查看将打印多少?如果为0或更小,不要感到惊讶。因此,您需要首先让unique
的逻辑工作。此外,初学者C++也不会得到这些问题——这听起来像是一个在线编码网站的问题。@ PaulMcKeZie你是正确的,它直接打印出0,当我直接打印什么代码>独特< <代码>返回。<代码>为(int大小=0;i<大小;i++)<代码>。你觉得有什么不对劲吗?另外,它是只有10个数字,还是数组可以是任意大小的?数字的最大数量是多少?最好使用std::unordered_set
@PaulMcKenzie你说得对,我刚刚编辑了这篇文章。@PaulMcKenzie但是unordered_set
也不会维护元素的原始顺序。该集合不会用于维护顺序。它将被简单地用作确定已经看到了什么的一种方法。最好使用std::unordered_set
@PaulMcKenzie你说得对,我刚刚编辑了这篇文章。@PaulMcKenzie但是unordered_set
也不会维护元素的原始顺序。该集合不会用于维护顺序。它将被简单地用作确定已经看到了什么的一种方法。
#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;
}
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;
}