векторный итератор и шаблонные функции - PullRequest
0 голосов
/ 06 апреля 2011

Может кто-нибудь объяснить мне, почему приведенный ниже код работает и выдает true? v1.begin() создает итератор, но при отладке, если я проверяю значение v1.begin() внутри функции сравнения, я вижу значение первого элемента вектора.

Связано ли это с тем, что нужно использовать typename vector<T>::iterator для именования итератора внутри шаблона? Было бы замечательно, если бы кто-то мог уточнить это

Спасибо

template<class U, class V> bool compare(const U &v1, const U &v2, const V &v3) {
    if ((v1 == v2) && (v2 == v3) ){
        return 1;
    } else {
        return 0;
    }
}


#include<iostream>
#include<vector>
using namespace std;

int main() {

    vector<int>     v1(10,3);
    vector<int>     v2(10,3);
    bool iComp = compare(v1.begin(), v1.begin() + 2, v2.begin());
    cout << typeid(v1.begin()).name() << "    "  << *v2.begin() << endl;

    return 1;
}

1 Ответ

1 голос
/ 06 апреля 2011

compare возвращает true тогда и только тогда, когда все три итератора указывают на один и тот же объект.Если итераторы указывают на объекты разных типов, это может привести к ошибке компиляции.

Итераторы указывают на разные объекты, поскольку все аргументы разные, поэтому compare возвращает false.Этот результат отбрасывается.

Затем программа печатает уникальную строку, идентифицирующую тип std::vector< int >::iterator.Это может быть длинная строка с упоминанием фрагментов std, vector и iterator, или это может быть просто pi для «указателя на целое число», если реализация <vector> использует typedef T *iterator.

Наконец, он печатает 10, потому что это первое значение в v2.

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