Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从数组中删除指定的值_C++_Arrays - Fatal编程技术网

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;istd::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;
}