2010-06-30 67 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

相关问题