在函数原型中使用向量迭代器

时间:2015-04-21 07:34:29

标签: c++ function iterator prototype

我想做以下事情:

vector<int> vec;    
auto iter = vec.begin();

现在我想要一个将iter作为输入并返回它的函数。

____ func(___ & iter)

要填写______应该是什么?

3 个答案:

答案 0 :(得分:2)

如果被叫方被标记为std::vector<int>::begin(),则

std::vector<int>::iterator会返回std::vector<int>::const_iterator类型的实例,或const

在您的示例中,decltype(iter)将为std::vector<int>::iterator,因此只需声明函数:

std::vector<int>::iterator
func (std::vector<int>::iterator iter);

请注意,STL迭代器设计为按值传递,因此我删除了函数签名中的引用。

答案 1 :(得分:0)

这实际上取决于您需要的迭代器类型。一般来说,它将是vector<int>::iteratorbegin()定义为:

iterator begin() noexcept;
const_iterator begin() const noexcept;

答案 2 :(得分:0)

有点愚蠢的例子,但这里有一些使用模板和decltype来推断迭代器类型的例子:

#include <vector>
#include <iostream>

using std::vector;
using std::cout;

template <class T> void double_vals(T vbeg, T vend)
{
    for (; vbeg != vend; ++vbeg)
        *vbeg *= 2;
}

template <class T, class T2> auto find_val(T vbeg, T vend, T2 val) -> decltype(vbeg)
{
    for (; vbeg != vend; ++vbeg)
        if (*vbeg == val) return vbeg;

    return vbeg;
}

int main()
{
    vector<int> vec = {10, 20, 30};

    auto it1 = vec.begin();
    auto it2 = vec.end();

    double_vals(it1, it2);
    auto it3 = find_val(it1, it2, 20);
    if (it3 != vec.end())
        cout << "Found value!\n";

    for (auto i : vec)
    {
        cout << i << '\n';
    }

    return 0;
}

// Note that you could avoid using decltype() here by doing 
template <class T, class T2> T find_val(T vbeg, T vend, T2 val)
{
    for (; vbeg != vend; ++vbeg)
        if (*vbeg == val) return vbeg;

    return vbeg;
}