如何迭代通用向量

时间:2016-05-31 07:51:14

标签: c++ templates c++11 vector iterator

我总是发现C ++模板难以理解,而C ++错误信息更是如此。我想要了解它,而不是总是感到困惑。这是最新奇怪的体验:

error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type ‘std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}’ requested

这个doozy来自以下代码:

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
void printVector(const vector<T>& v) {
    for (typename vector<T>::iterator iter = v.begin; iter != v.end; iter++) {
        cout << *iter << endl;
    }
}

int main() {
    vector<int> v{1, 2, 3};
    printVector(v);
    return 0;
}

如果我使用基于C ++ 11范围的循环,迭代向量没有问题。我想学习如何使用迭代器来实现它。

有人可以解释错误的含义以及解决方法吗?

如果我能得到一本能很好地解释模板的书的推荐,那也很棒。

3 个答案:

答案 0 :(得分:3)

请仔细查看错误消息。它说你正在尝试将函数转换为迭代器。您应该通过添加()来调用它们。

更改

for (typename vector<T>::iterator iter = v.begin; iter != v.end; iter++) {

for (typename vector<T>::iterator iter = v.begin(); iter != v.end(); iter++) {
                                                ~~               ~~

对于C ++书籍,The Definitive C++ Book Guide and List

答案 1 :(得分:1)

您错过了beginend中的括号,并且由于您通过const引用传递了该向量,因此您需要const_iterator。< / p>

template <typename T>
void printVector(const vector<T>& v) {
    for (typename vector<T>::const_iterator iter = v.begin(); iter != v.end(); iter++) {
                             ^^^^^^^^^^^^^^               ^^                ^^
        cout << *iter << endl;
    }
}

更好的是使用范围基数:

template <typename T>
void printVector(const vector<T>& v) {
    for(auto &&e : v) {
        cout << e << endl;
    }
}

答案 2 :(得分:0)

std::vector<T>::begin::end是函数;你需要打电话给他们:

for (typename vector<T>::iterator iter = v.begin(); iter != v.end(); iter++) {
//                                              ^^               ^^
    cout << *iter << endl;
}

此外,您正在尝试将const迭代器转换为非const迭代器。您需要使用vector<T>::const_iterator,或者更好的是auto