【问题标题】:Erasing string from vector gives segmentation error [duplicate]从向量中删除字符串会产生分段错误[重复]
【发布时间】:2019-07-25 06:54:43
【问题描述】:

如果字符串等于提供的原始单词,我试图从向量中删除一个字符串,因此输出不会将输入的单词算作它自己的字谜(如果有意义的话)

for (std::vector<std::string>::const_iterator word = anagrams.begin();
       word != anagrams.end(); ++word) {
    if (*word != originalstring) {
      ++totalNumber;
      // std::cout << *i;
    } else {
      anagrams.erase(word);
    }
  }

真的不确定为什么我会收到此错误,因为它应该删除原始单词,但我收到分段错误:/

【问题讨论】:

标签: c++ c++11


【解决方案1】:

std::vector::erase

在擦除点或之后使迭代器和引用失效,包括 end() 迭代器。

返回值 最后一个被移除元素之后的迭代器。如果迭代器 pos 引用最后一个元素,返回 end() 迭代器。

你需要稍微改变你的迭代器增量,以解决你擦除后迭代器失效的问题。

for (std::vector<std::string>::const_iterator word = anagrams.begin();
       word != anagrams.end();) {
    if (*word != originalstring) {
      ++totalNumber;
      ++word;
      // std::cout << *i;
    } else {
      word = anagrams.erase(word);
    }
  }

正如 tkasul 所指出的,在这里使用 std 算法肯定是一个更清洁的解决方案:

anagrams.erase(std::remove(anagrams.begin(), anagrams.end(), originalstring), anagrams.end());
totalNumber = anagrams.size();

【讨论】:

  • 删除-擦除将是一个更清洁的解决方案。
  • 非常感谢 :) 它完美运行
  • 什么是删除擦除?
  • 我怀疑这就是你建议的 tkausl?当然不建议使用 OP 不熟悉的代码 :)
  • 是的,我不是很熟悉它,但我想学习和理解它。我了解除此之外的所有内容,并且在我得到原始字符串的返回范围内,不能在没有默认捕获的 lambda 中隐式捕获
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2021-11-20
  • 2013-05-01
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多