Почему код печатает последний std :: cout? - PullRequest
1 голос
/ 30 июня 2010
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 Ответ

13 голосов
/ 30 июня 2010

vector Функция size() возвращает значение типа size_t, которое не имеет знака.Таким образом, если size() вернет 0 и вы вычтете из него 1, вы получите очень большое число, а не -1.Это очень большое число будет больше 0, и поэтому условие i < v.size() - 1 будет истинным, поскольку i равно 0.

РЕДАКТИРОВАТЬ :

Возможно, мне следуетдобавьте, что обычно при итерации по массиву или vector вы выполняете итерацию, пока ваш индекс меньше размера массива или vector, а не размера - 1.

 for(int i = 0; i < v.size(); ++i)
    std::cout << "done" << endl;

, скорее всего,будь тем, кем ты действительно хочешь заниматься.Даже если вы использовали (int)v.size() - 1, чтобы избавиться от проблемы со знаком и неподписанным, цикл все равно будет неправильным, потому что вы пропустите последний элемент в тех случаях, когда у вас действительно есть элементы в vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...