【问题标题】:Logic error using .erase (C++)使用 .erase (C++) 的逻辑错误
【发布时间】:2017-09-11 20:19:52
【问题描述】:

所以我的程序只是读取输入的数字并按顺序列出它们。如输出所示。 没有使用算法库,我对它进行了排序,去掉了重复数据。但是,如果有重复的数据值,则不会打印向量的最后一个值。我是否错误地使用了.erase?

void remove_repeated(int size, vector<int>& num_vec){
    for(int i = 0; i < num_vec.size(); i++){
        if(num_vec[i]==num_vec[i+1]){
            num_vec.erase((num_vec.begin()+i));
        }   
    }
}

没有重复值时的输出:

                 **Welcome to the HW Reading Program**
 Please, enter your HW:1-10

 Do Problems: 1, 2, 3, 4, 5, 6, 7, 8, 9,and 10

当一个值重复时输出:

                 **Welcome to the HW Reading Program**
 Please, enter your HW: 1-10,1-3

 Do Problems: 1, 2, 3, 4, 5, 6, 7, 8,and 9

【问题讨论】:

  • A) MVCE B) 修复缩进。 TIA。
  • 您发布了很多不相关的代码。您可以发布一个简单的main 程序,用重复的硬编码值填充一个向量,然后简单地调用remove_repeated 来查看它是如何运行的。排序与您遇到的问题无关。
  • @Borgleader A) 我已尽我所能修复它。 B) 我的压痕的哪一部分是不可接受的?
  • @Pouya -- Please see this as to what a Minimal, Compilable, and Verifiable Example denotes。无需显示排序、提示或其他任何内容。我们从给定的测试数据中看到该函数有问题。
  • 这个问题的 MCVE 示例:ideone.com/XV9P3G 请注意,它除了在 vector 上运行 remove_repeated 之外什么都不做,旨在暴露错误并打印出结果。

标签: c++ logic


【解决方案1】:

从向量中删除索引i 处的元素后,下一个元素位于索引i,而不是索引i+1。此外,与i+1 比较时,您必须注意不要越界,即您的循环必须如下所示:

for(int i = 0; i < num_vec.size()-1;){
    if(num_vec[i]==num_vec[i+1]){
        num_vec.erase((num_vec.begin()+i));
    } else {
        i++;
    }
}

您还应该考虑使用标准库提供的功能。 set 仅包含唯一元素,或者您可以使用 erase+unique(有关详细信息,请参见例如 here)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多