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

问题描述 投票:1回答:1

我试图循环通过矢量的最新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,它应该与第一个输出相同

c++ windows loops vector
1个回答
1
投票

那是因为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;
}
© www.soinside.com 2019 - 2024. All rights reserved.