我试图遍历向量的最新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,因此其输出应与第一个相同。
答案 0 :(得分:1)
这是因为size_type
返回i < myVector.size()
作为类型,此类型是未签名的。这意味着int
比较两种不同的类型unsigned int
和size()
。编译器会将您的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)