【问题标题】:How would you iterate a vector? [duplicate]你将如何迭代一个向量? [复制]
【发布时间】:2016-07-25 10:26:49
【问题描述】:

这是my code

std::vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);
array.push_back(5);

for (int i = 0; i < array.size(); i++) {
    if(array[i]==2 || array[i]==5) {
        array.erase(array.begin() + i);
        printf("### REMOVED ###\n", array[i], i);
    } 

    printf("inside val: %d | index: %d\n", array[i], i);
}

但是如你所见,它输出:

inside val: 1 | index: 0
### REMOVED ###
inside val: 3 | index: 1
inside val: 4 | index: 2
### REMOVED ###
inside val: 5 | index: 3

当我的“期望”是:

inside val: 1 | index: 0
### REMOVED ###
inside val: 2 | index: 1
inside val: 3 | index: 2
inside val: 4 | index: 3
### REMOVED ### 
inside val: 5 | index: 4

它在操作自身的过程中会“混淆”索引/数组的大小,因为会改变内存指针和目标的大小。

我的习惯是使用foreach statementiterate a collection (C#/.Net),即使我在迭代过程中删除/添加元素,下一个始终是开始列表中的下一个。

你会如何处理C++

【问题讨论】:

  • 你有 C# 的例子吗?
  • @TAS:当然:rextester.com/EZMYM12731
  • 尽管您的问题很清楚可以回答,但您没有在 C# sn-p 中执行任何删除操作?

标签: c++ for-loop foreach iteration cycle


【解决方案1】:

可以删除元素的for 循环的规范形式如下:

for(auto i = begin(coll); i != end(coll);) {

    // ...

    if(hasToRemove)
        i = coll.erase(i);
    else
        ++i;
}

【讨论】:

  • 我无法运行它:cpp.sh/273mz
  • @markzzz 那是因为i 现在是一个迭代器。您必须取消引用它 (*i) 才能访问它所引用的值,并且您可以使用 i - begin(coll) 将索引检索到向量中。
  • 你能发布一个简单的例子吗?我无法弄清楚我想要的结果。
  • 我做了什么:cpp.sh/5no5
  • 结果不同 ### REMOVED ### inside val: 4 |索引:2 内 val:5 | index: 3 ### REMOVED ### inside val: 5 | index: 4 ### REMOVED ### inside val: 0 |索引:5 内 val:0 |指数:5
【解决方案2】:

使用迭代器:

int ind = 0;
for (auto i = array.begin(); i != array.end(); ) {
    if(*i==2 || *i==5) {
        i = array.erase(i);
        printf("### REMOVED ###\n");
    } 
    else {
    ++i;
    ++ind;
    }

    printf("inside val: %d | index: %d\n", *i, ind);
}

【讨论】:

    【解决方案3】:

    只需像这样更改您的代码

    for (int i = 0; i < array.size(); i++) {
        int temp=i;
        if(array[temp]==2 || array[temp]==5) {
            array.erase(array.begin() + temp);
            printf("### REMOVED ###\n", array[temp], temp);
            i--;
        } 
    
        printf("inside val: %d | index: %d\n", array[temp], temp);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 2017-08-29
      • 2016-05-08
      • 2015-07-09
      • 2019-08-12
      • 2011-03-28
      • 2021-01-23
      • 1970-01-01
      • 2017-09-21
      相关资源
      最近更新 更多