簡體   English   中英

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

[英]Using vector iterator in function prototype

我要執行以下操作:

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

現在,我需要一個將iter作為輸入並返回iter的函數。

____ func(___ & iter)

其中___是要填寫。你應該___是什么?

std::vector<int>::begin()返回一個類型為std::vector<int>::iterator的實例,如果被調用者標記為const ,則返回std::vector<int>::const_iterator

在您的示例中, decltype(iter)將為std::vector<int>::iterator ,因此只需聲明函數即可,如下所示:

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

注意,STL迭代器被設計為按值傳遞,因此我擺脫了函數簽名中的引用。

這實際上取決於您需要的迭代器類型。 通常它將是vector<int>::iterator begin()定義為:

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

有點愚蠢的示例,但是這里有一些使用模板和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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM