为什么代码打印最后一个std :: cout?

时间:2010-06-30 16:47:45

标签: c++ vector

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 个答案:

答案 0 :(得分:13)

vector的{​​{1}}函数返回一个未签名的size()类型的值。因此,如果size_t返回0并从中减去1,那么您将得到一个非常大的数而不是-1。由于size()为0,因此非常大的数字将大于0,因此条件i < v.size() - 1将为真。

修改

我应该通常在迭代数组或i时添加,只要您的索引小于数组的大小或vector而不是大小-1,就会迭代。 / p>

vector

可能就是你真正想做的事情。即使您使用 for(int i = 0; i < v.size(); ++i) std::cout << "done" << endl; 来摆脱已签名和未签名的问题,循环也会出错,因为如果您实际拥有(int)v.size() - 1中的元素,则会错过最后一个元素。