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 :: cout如何打印一个std :: string?
- 3. 为什么std :: distance会打印一个`-`?
- 4. C++。为什么std :: cout << char + int打印int值?
- 5. std :: cout将不打印
- 6. 为什么这段代码最后打印'undefined`?
- 7. 这段代码为什么只打印链表的最后一个元素?
- 8. 此代码打印什么?为什么?
- 9. 为什么我的cout打印两次?
- 10. 为什么这段代码打印0
- 11. 为什么这个数组只打印最后一个数字?
- 12. 为什么这个代码不打印字符向后
- 13. 为什么std :: cout不能为我的int8_t号打印正确的值?
- 14. 为什么我的最后一个元素不打印?
- 15. 为什么不打印该单词的最后一个字符?
- 16. 这是为什么这只打印最后一个字?
- 17. 为什么此代码不打印“20”?
- 18. 此代码不打印。为什么?
- 19. 此代码为什么打印地址?
- 20. 为什么此代码打印出“0”
- 21. 为什么我的代码打印`os.path`
- 22. 为什么此代码不打印?
- 23. 为什么此代码打印两次?
- 24. 为什么我的代码打印'无'?
- 25. 为什么这个Python代码不打印什么?
- 26. 为什么代码没有cout?
- 27. 为什么std :: cout不能打印来自union的值,但printf呢?
- 28. 为什么不是这个代码打印我的数组?
- 29. 此代码为什么打印一个不是我最大的数字?
- 30. std :: cout和std :: wcout有什么区别?
'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