Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于循环a";“空的”;带负迭代器的向量?_C++_Windows_Loops_Vector - Fatal编程技术网

C++ 对于循环a";“空的”;带负迭代器的向量?

C++ 对于循环a";“空的”;带负迭代器的向量?,c++,windows,loops,vector,C++,Windows,Loops,Vector,我正在尝试循环一个向量的最新10个条目。向量的大小可以是0到100之间的任何值 作为最简单的解决方案,我认为从vector.size()开始循环-10;然后检查内部,如果不是负值,我可以访问向量对象 不幸的是,它不起作用(根本不循环),但是如果我用硬编码的数字替换相同的代码,它就起作用了 我做错了什么,或者问题在哪里 for (int i = -10; i < 0; i++) { std::cout << "Normal Loop: i = " << i &

我正在尝试循环一个向量的最新10个条目。向量的大小可以是0到100之间的任何值

作为最简单的解决方案,我认为从vector.size()开始循环-10;然后检查内部,如果不是负值,我可以访问向量对象

不幸的是,它不起作用(根本不循环),但是如果我用硬编码的数字替换相同的代码,它就起作用了

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

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

std::cout这是因为
std::vector::size()
返回
size\u type
作为类型,该类型是无符号的。这意味着
i
比较两种不同的类型,
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;
}

编译器是否向您提供了有关使用的不同
int
类型的信息?myVector.size()返回一个无符号的大小。因此,我被初始化为类似18446744073709551615-10的值。您可以使用反向迭代器。我宁愿编写
int i=std::max(0,myVector.size()-10)
否则,您需要一个
if
或在访问
myVector[i]
后运行到UB,当大小小于10@user463035818您的意思是
std::max(0,myVector.size()-10)
?否则将无法编译
std::vector
s
size\u类型
不是“通常无符号的”(这意味着它可能是有符号的)。它被指定为无符号类型。@Peter你说得对,我忘了重新编辑它,谢谢。
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;
}
std::vector<int> myVector;
//fill vector..
auto itr = myVector.rbegin();
int count = 10;
while(itr != myVector.rend() && count-- > 0)
{
  //process.
  ++itr;
}