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()
比较了两种不同的类型,int
和unsigned 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一个带有负迭代器的“空”向量?的主要内容,如果未能解决你的问题,请参考以下文章