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