循环带有负迭代器的“空”向量?

时间:2019-03-28 12:07:38

标签: c++ windows loops vector

我试图遍历向量的最新10个条目。向量的大小可以在0到100之间。

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

可悲的是,它不起作用(根本没有循环),但是如果我用硬编码数字替换相同的Code,它就会起作用。

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

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,因此其输出应与第一个相同。

1 个答案:

答案 0 :(得分:1)

这是因为size_type返回i < myVector.size()作为类型,此类型是未签名的。这意味着int比较两种不同的类型unsigned intsize()。编译器会将您的int提升为无符号类型。因为此int为负数,并且无符号类型不能包含负数,所以它将回绕,并且最终将得到一个非常大的值,因此永远不会满足循环条件。

您可以明确地投射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()并循环直到std::vector<int> myVector; //fill vector.. auto itr = myVector.rbegin(); int count = 10; while(itr != myVector.rend() && count-- > 0) { //process. ++itr; } 或循环10次,例如:


df_ABX <- read.table(text = 'Name   col1    col2    col3    col4
                             name1  10  20  30  40
                             name2   5  10  15  20
                             name13 17  16  15  14', 
                 header = TRUE)  

df_BAX <- read.table(text = 'Name   col1    col2    col3    col4
                             name1  11  21  31  41
                             name2   4   9   8  19
                             name13 10  10  15  15', 
                 header = TRUE)

df_XAB <- read.table(text = 'Name   col1    col2    col3    col4
                             name1   9  19  29  28
                             name2  15  15  55  25
                             name13 18  10  11  12', 
                 header = TRUE)