C++ 从数组中删除指定的值
我试图创建一个函数,它将元素从一个数组复制到另一个数组,除非提到指定的变量,在这种情况下,它不会被复制。然后,该函数将输出不包含指定变量的新数组C++ 从数组中删除指定的值,c++,arrays,C++,Arrays,我试图创建一个函数,它将元素从一个数组复制到另一个数组,除非提到指定的变量,在这种情况下,它不会被复制。然后,该函数将输出不包含指定变量的新数组 int *NewArray(int array[], int len, int num){ int *array2 = new int[len]; int temp; for(int i=0;i<len;i++){ temp = array[i]; if(temp != num){
int *NewArray(int array[], int len, int num){
int *array2 = new int[len];
int temp;
for(int i=0;i<len;i++){
temp = array[i];
if(temp != num){
array2[i]=temp;
}
else{
array2[i] = array[i+1];
}
}
return array2;
}
int*NewArray(int-array[],int-len,int-num){
int*array2=新的int[len];
内部温度;
for(int i=0;ifor
循环的问题是它只使用一个索引访问两个数组。您需要两个索引
假设您要删除的项目位于索引1。之后,您需要确保
array2[i] = array[i+1];
即使您有这样一行,它也只用于匹配的项目。它不会将该逻辑用于后续项目
这就是您需要的:
for(int i=0, j = 0; i<len; ++j ){
if(num == array[j]){
++j;
// Don't increment i, increment j
// to skip the element from array
}
else {
array2[i] = array[j];
// Increment i since it is being assigned a value from array.
++i;
}
}
for(int i=0,j=0;i如果
如下所示,您可以使用std::copy\u:
int *NewArray(int array[], int &len, int num) {
int *array2 = new int[len];
auto it = std::copy_if(array, array + len, array2,
[&num](int const i){ return i != num; });
len = std::distance(array2, it);
return array2;
}
在您的情况下,使用std::vector之类的东西会很有好处,但鉴于您可能有使用数组的正当理由,您正在以一种比需要更复杂的方式进行操作。这肯定是一种更为c风格的语法,但我认为它执行您希望它执行的操作,而不需要真正进入任何STL库
#include <iostream>
#include <cstdlib>
int *NewArray(const int const array1[], const size_t len, const int num, size_t *newlen) {
int *array2 = new int[len];
size_t counter = 0;
for (int i = 0; i < len; i++)
if (array1[i] != num)
array2[counter++] = array1[i];
*newlen = counter;
return array2;
}
int main(int argc, char **argv) {
int arr1[] = { 1, 2, 3, 4, 5, 6, 7};
size_t oldlen = sizeof arr1 / sizeof(int);
size_t newlen;
int *arr2 = NewArray(arr1, sizeof arr1 / sizeof(int), 3, &newlen);
int i;
for (i = 0; i < newlen; ++i)
std::cout << arr2[i] << std::endl;
delete arr2;
system("pause");
}
#包括
#包括
int*NewArray(const int const array1[],const size\u t len,const int num,size\u t*newlen){
int*array2=新的int[len];
计数器的大小=0;
对于(int i=0;i std::cout为什么不使用std::vector
?为什么不使用?PS:新数组可能更小?@EdHeal此任务要求我们不使用vector。@JoshuaLucero-很抱歉,黑猫已经出来了,大锅已经烧开了:-)在lambda中通过引用捕获num(如果有的话)的原因是什么?或者它是约定的吗?@Goodies它存储新数组的长度。不,我理解这一点,但为什么是通过引用而不是通过值?即为什么是[&num]
而不是[num]
?有什么特别的原因吗?对于int来说似乎毫无意义。@Goodies啊,没有特别的原因。这两种方式都没有区别。我认为这是错误的……如果一行中有两个'temp',会发生什么?如果temp=3,并且数组是{1,2,3,3,4,5},您仍然会得到{1,2,3,4,5}@Goodies,我不认为这是一个问题。问题是调用函数不知道删除了多少项。请参阅。抱歉,我没有看到其中的“else”。这样可以防止这种情况发生。谢谢。
std::vector<int> NewVector(const std::vector<int> const vec1, const int num) {
std::vector<int> vec2 (vec1.size());
auto it = std::copy_if(
vec1.begin(), // where to start
vec1.end(), // where to end
vec2.begin(), // where to insert
[&num](const int i) { return i != num; } // lambda predicate
);
vec2.resize(std::distance(vec2.begin(), it));
return vec2;
}