Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++中的动态分配数组来构建一个简单的列表。我有一个函数remove(int item),它应该删除列表中所有出现的item。但是,如果我在数组中循环从0到length,我担心我会超出数组的边界,因为length在删除项目时会发生变化: int List::pop(int index) { int retval = data[index]; for (int i = index; i < length; i++) data[i] = data[i+1]; length--; return retval; } void List::remove(int item) { for (int i = 0; i < length; i++) { if (data[i] == item) pop(i); } int List::pop(int索引) { int retval=数据[索引]; for(int i=索引;i,C++将更新< >在删除()/ > >(代码)> >代码> >代码> >之后,还是保持原来的值?被调用?_C++_Arrays - Fatal编程技术网

对于c+中的循环迭代+; 我使用C++中的动态分配数组来构建一个简单的列表。我有一个函数remove(int item),它应该删除列表中所有出现的item。但是,如果我在数组中循环从0到length,我担心我会超出数组的边界,因为length在删除项目时会发生变化: int List::pop(int index) { int retval = data[index]; for (int i = index; i < length; i++) data[i] = data[i+1]; length--; return retval; } void List::remove(int item) { for (int i = 0; i < length; i++) { if (data[i] == item) pop(i); } int List::pop(int索引) { int retval=数据[索引]; for(int i=索引;i,C++将更新< >在删除()/ > >(代码)> >代码> >代码> >之后,还是保持原来的值?被调用?

对于c+中的循环迭代+; 我使用C++中的动态分配数组来构建一个简单的列表。我有一个函数remove(int item),它应该删除列表中所有出现的item。但是,如果我在数组中循环从0到length,我担心我会超出数组的边界,因为length在删除项目时会发生变化: int List::pop(int index) { int retval = data[index]; for (int i = index; i < length; i++) data[i] = data[i+1]; length--; return retval; } void List::remove(int item) { for (int i = 0; i < length; i++) { if (data[i] == item) pop(i); } int List::pop(int索引) { int retval=数据[索引]; for(int i=索引;i,C++将更新< >在删除()/ > >(代码)> >代码> >代码> >之后,还是保持原来的值?被调用?,c++,arrays,C++,Arrays,从数组末尾开始,然后向后工作到开始位置。或者,调用pop(i--)而不是pop(i)。这将备份i,这样您就不会跳过列表中的任何元素(包括最后一项) 第一种方法的优点是不浪费时间来删除最终要删除的元素。 < p>条件表达式 i>长度在循环的每次迭代之前都被完整地评估。C++编译器不会缓存 i>代码>也不会缓存这个代码>代码>长度赋值。只要正确更新length变量,此表达式将不允许i超出数组的边界 不过,这对跳过元素的问题没有帮助。为此,我将切换到while循环 int i = 0; while (

从数组末尾开始,然后向后工作到开始位置。或者,调用
pop(i--)
而不是
pop(i)
。这将备份
i
,这样您就不会跳过列表中的任何元素(包括最后一项)


第一种方法的优点是不浪费时间来删除最终要删除的元素。

< p>条件表达式<代码> i>长度在循环的每次迭代之前都被完整地评估。C++编译器不会缓存<代码> i>代码>也不会缓存这个代码>代码>长度<代码>赋值。只要正确更新
length
变量,此表达式将不允许
i
超出数组的边界

不过,这对跳过元素的问题没有帮助。为此,我将切换到while循环

int i = 0;
while (i < length) {
  if (data[i] == item) {
    pop(i);
  } else {
    i++;
  }
}
inti=0;
while(i

在这种情况下,如果我们
pop
一个项目,我们不会增加。这样,索引将保持在同一位置,并且能够捕获在数组中相邻出现的重复项目

另一个解决方案是搜索反向。只保留那些与要删除的项目不相等的项目

void List::remove(int item)
{
    int insert = 0;
    for (int i = 0; i < length; i++) {
        if (data[i] != item)
          data[insert++] = data[i];
    }
    length = insert;
}
void列表::删除(int项)
{
int insert=0;
for(int i=0;i<>代码>在更简单的条件下,在这个例子中,C++是按值调用还是引用调用?这个算法具有O(n ^ 2)性能,如<代码> POPE()/CODE >即使有多个副本,也可以一次复制其余的值。数据和直接复制
!=item
元素。他的问题并不是真正越过列表的末尾;而是跳过任何删除元素后面的每个元素。+1 While循环也比for循环更可取,因为它提示读者循环开始时迭代的次数不是固定的。这与当作为for循环编写时,这是显而易见的。我认为这是唯一不做任何浪费工作的方法。没有任何东西会被移动一次以上。非常好。