2010-06-30 69 views
1
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); 
} 
+1

'return(EXIT_SUCCESS);'在C++中是無用的。刪除1到矢量大小肯定是一個錯誤。編譯時打開警告可能是個好主意。 – log0 2010-06-30 17:40:55

+0

爲什麼'return EXIT_SUCCESS;'在C++中無用? – 2010-06-30 17:54:42

+0

@Greg不一定沒用,但我相信我們可以省略return EXIT_SUCCESS;線。該標準將此定義爲在我們省略返回時格式良好,所以當我們這樣做時很可能會將EXIT_SUCCESS返回給操作系統。 – stinky472 2010-06-30 18:29:02

回答

13

vectorsize()函數返回一個無符號類型的值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中的元素,你會錯過最後一個元素。

+0

+1正確。 (size(-1)上的-1是奇怪的,你已經通過使用<而不是<=。) – 2010-06-30 16:53:48

+1

現代編譯器應該警告這個問題,例如, g ++用'-Wall'打印「警告:在有符號和無符號整數表達式之間進行比較。」@mawandm:在編譯時,儘可能多地啓用警告。例如,我通常用'-Wall -Wextra -Wconversion -Wunused'運行g ++。 – Philipp 2010-06-30 17:28:31

+0

我所需要的只是第一個n-1元素,但是在使用v.at(i + 1)的循環中使用n(th)元素。這就是爲什麼我需要循環到v.size() - 1 – mawandm 2010-07-11 17:01:40