For-Loop一个带有负迭代器的“空”向量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了For-Loop一个带有负迭代器的“空”向量?相关的知识,希望对你有一定的参考价值。

我试图循环通过矢量的最新10个条目。矢量的大小可以是0到100之间的任何值。

作为最简单的解决方案,我虽然在vector.size() - 10开始循环;然后在里面检查它是否为负数,我可以访问矢量对象。

可悲的是,它不起作用(根本不循环),但如果我用硬编码的数字替换相同的代码,它的工作原理。

我做错了什么,或问题出在哪里?

for (int i = -10; i < 0; i++) {
    std::cout << "Normal Loop: i = " << i << std::endl;
}

这可行,但循环向量不会:

std::vector<int> myVector;
for (int i = myVector.size() - 10; i < myVector.size(); i++) {
    std::cout << "Vector Loop: i = " << i << std::endl;
}

第一个循环打印所有10个数字(从-10到-1),但第二个循环不打印任何内容。

由于myVector.size()现在为0,它应该与第一个输出相同

答案

那是因为std::vector::size()size_type作为类型返回,这种类型是无符号的。这意味着i < myVector.size()比较了两种不同的类型,intunsigned int。编译器会将你的int“提升”为无符号类型。因为这个int是负数,而无符号类型不能保持负值,所以它会回滚,你最终会得到一个非常大的值,因此永远不会满足循环条件。

你可以明确地施放size()

std::vector<int> myVector;
for (int i = myVector.size() - 10; i < static_cast<int>(myVector.size()); i++) {
    std::cout << "Vector Loop: i = " << i << std::endl;
}

或者为了更清洁的方法尝试使用rbegin()并循环直到rend()或直到你循环10次,类似于:

std::vector<int> myVector;
//fill vector..
auto itr = myVector.rbegin();
int count = 10;
while(itr != myVector.rend() && count-- > 0)
{
  //process.
  ++itr;
}

以上是关于For-Loop一个带有负迭代器的“空”向量?的主要内容,如果未能解决你的问题,请参考以下文章

使用 for-loop 和 if 函数创建一个新向量?

将空范围传递给采用一对迭代器的函数的简洁/简洁的方法是啥?

向量和迭代器的分段错误? [关闭]

模式识别与机器学习——3.8可训练的确定性分类器的迭代算法

关于向量、指针和迭代器的问题

如何在迭代器中正确引用第一个向量容器?