向量迭代器循环可用于g ++,但不适用于VisualC ++,为什么?

法尔科

我有一个在Linux机器上编写的程序。它使用a std::vector<std::string>,我用for循环遍历它,就像这样

std::vector<std::string> words;
words.push_back("A");
words.push_back("B");
words.push_back("C");
// loop
for (auto it = words.end(); it >= words.begin(); it--)
{
    std::string word = *it; // invalid deref?
    // do things with word
    if (word == "B")
    {
        words.erase(it);
    }
    std::cout << word << std::endl;
}

int i = 0;
for (std::string word : words)
{
    std::cout << i++ << word << std::endl;
}

使用g ++作为编译器,可以按预期运行,打印C,B和A。但是,当我使用VisualStudio运行它时,会收到无效的解除引用异常。

我向后遍历向量,因为我想从中删除项目,如果向前循环则与迭代器混淆。
我有一个使用整数并使用获取项目的解决方法std::vector<std::string>.at(int),但是我很好奇为什么这适用于我的linux机器而不是Windows?

丘里尔

正如您正确评论的那样,存在无效的取消引用。

std::string word = *it;

std::string word = *words.end()在第一次迭代中导致不确定的行为。因此,在一个系统上工作并在另一个系统上引发异常是完全有效的。

反向迭代向量的正确方法是

for(auto it = words.rbegin(); it != words.rend(); it++) {...}

但是,对于从矢量中删除元素,“擦除删除惯用语”可能更有用:

words.erase(std::remove(words.begin(), words.end(), "B"), words.end());

或者,如果您的情况更复杂,请使用lambda:

words.erase(std::remove_if(
   words.begin(), 
   words.end(), [](const std::string &name){return name == "B";}
), names.end());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用列表推导查找变量可用于globals(),但不适用于locals()。为什么?

为什么Android GPU监视器适用于6.0.1,但不适用于7.1.2?

列表理解有效,但不适用于循环-为什么?

为什么命名参数适用于np.reshape但不适用于x.reshape?

为什么我的 CSS 没有被应用?它适用于可待因,但不适用于 VSCode

访问文字的属性适用于所有类型,但不适用于`int`;为什么?

理解为什么纯CSS视差效果适用于div,但不适用于body标签吗?

我的替换函数适用于数组,但不适用于也是数组的 HTML 集合。为什么?

为什么我的函数适用于矩阵但为什么不适用于向量?

为什么std :: begin()和std :: end()可用于固定数组,但不适用于动态数组?

为什么exist()函数起作用,但不适用于布尔语句?

为什么下界不适用于向量对

为什么我的for循环不适用于对象?

为什么每个循环不适用于JSON数组

为什么数据框循环不适用于列

为什么我的 for 循环适用于“&&”而不适用于“,”

正则表达式适用于“查找”但不适用于“在文件中查找” - 为什么?怎么修?

为什么相同的 Tensorflow 模型适用于数组列表,但不适用于未批量处理的 tf.data.Dataset?

显示验证错误的工具提示适用于绑定到POCO的TextBlock,但不适用于POCO内的Property。为什么?

为什么以下代码适用于一种模型但不适用于另一种模型?

线性回归算法适用于一个数据集,但不适用于另一个类似的数据集。为什么?

当我从终端运行脚本时,我的脚本运行良好,但不适用于cron。为什么?

在新行上爆炸可与“ \ n”一起使用,但不适用于PHP_EOL。为什么?

为什么Hibernate HSQL Concat不适用于MSSQL?

为什么@Autowired不适用于通用类型T?

为什么通用引用不适用于数组?

为什么constexpr不适用于构造函数?

为什么忽略SIGTRAP不适用于asm?

为什么Map在Groovy中不适用于GString?