using namespace std;
template<typename T>
int f(vector<T> &v){
return v.size();
}
template<typename T>
class B{
public:
int size(){
return v.size();
};
private:
vector<T> v;
};
int main(int argc, char** argv) {
B<string> b;
vector<string> v;
for(int i=0; i<f<string>(v)-1; i++)
std::cout << "using fn template" << endl;
for(int i=0; i<b.size()-1; i++)
std::cout << "using class B" << endl;
for(int i=0; i<v.size()-1; i++)
std::cout << "done" << endl; //Why is this printing???
return (EXIT_SUCCESS);
}
回答
vector
的size()
函数返回一个无符号类型的值size_t
。所以,如果size()
返回0并且您从中减去1,那么您将得到一个非常大的数字而不是-1。非常大的数目将大于0,并且自i
是0
EDIT条件i < v.size() - 1
因此将是真实的:
迭代数组或一个vector
当我应该补充的是,通常,你只要你的指数小于数组的大小或vector
,而不是大小迭代 - 1
for(int i = 0; i < v.size(); ++i)
std::cout << "done" << endl;
可能会是你真正想做的事情。即使你使用(int)v.size() - 1
来摆脱签名和未签名的问题,循环仍然是错误的,因为如果你实际上有vector
中的元素,你会错过最后一个元素。
+1正确。 (size(-1)上的-1是奇怪的,你已经通过使用<而不是<=。) – 2010-06-30 16:53:48
现代编译器应该警告这个问题,例如, g ++用'-Wall'打印“警告:在有符号和无符号整数表达式之间进行比较。”@mawandm:在编译时,尽可能多地启用警告。例如,我通常用'-Wall -Wextra -Wconversion -Wunused'运行g ++。 – Philipp 2010-06-30 17:28:31
我所需要的只是第一个n-1元素,但是在使用v.at(i + 1)的循环中使用n(th)元素。这就是为什么我需要循环到v.size() - 1 – mawandm 2010-07-11 17:01:40
- 1. 为什么std :: cout打印4.9999999为5?
- 2. 为什么std :: distance会打印一个`-`?
- 3. C++。为什么std :: cout << char + int打印int值?
- 4. std :: cout将不打印
- 5. 为什么这段代码最后打印'undefined`?
- 6. 此代码打印什么?为什么?
- 7. 为什么std :: cout不能为我的int8_t号打印正确的值?
- 8. 为什么此代码打印两次?
- 9. 为什么此代码不打印“20”?
- 10. 此代码为什么打印地址?
- 11. 为什么这个Python代码不打印什么?
- 12. 为什么代码没有cout?
- 13. 为什么std :: cout不能打印来自union的值,但printf呢?
- 14. 此代码为什么打印一个不是我最大的数字?
- 15. 代码打印无,然后要求输入。为什么?
- 16. cout for 2D字符串矢量仅打印最后一行
- 17. 为什么不打印我矩阵的最后一列?
- 18. 如何删除放入std :: cout的最后一个字符?
- 19. 为什么词典只打印最后3个项目?
- 20. 将字符打印为std :: cout的数字
- 21. 这段代码有什么问题?为什么它打印“1”?
- 22. 为什么我的代码打印不止一次?
- 23. 这个std :: cout最终会打印垃圾还是意想不到的东西?
- 24. 为什么这个列表只打印出最后一个字符?
- 25. 在二维数组中打印最大数字 - 为什么我的代码打印三个数字
- 26. 为什么ClassName打破这个代码?
- 27. 为什么打印“\\”只打印出一个反斜杠?
- 28. 为什么egrep只在我egrep'man egrep`文件时打印最后一个匹配?
- 29. 什么是最好的Visual Studio插件的打印代码
- 30. COUT打印后崩溃对象的getter
'return(EXIT_SUCCESS);'在C++中是无用的。删除1到矢量大小肯定是一个错误。编译时打开警告可能是个好主意。 – log0 2010-06-30 17:40:55
为什么'return EXIT_SUCCESS;'在C++中无用? – 2010-06-30 17:54:42
@Greg不一定没用,但我相信我们可以省略return EXIT_SUCCESS;线。该标准将此定义为在我们省略返回时格式良好,所以当我们这样做时很可能会将EXIT_SUCCESS返回给操作系统。 – stinky472 2010-06-30 18:29:02