2015-04-21 2 views
-1

я хочу сделать следующее:Использование вектора итератор в прототипе функции

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

Теперь я хочу функцию, которая принимает ИТЭР в качестве входных данных и возвращает ИТЭР.

____ func(___ & iter) 

где ___ должна быть заполнена. Что должно ___ быть?

+0

Если вы читали какой-либо предварительной C++ 11 учебника, вы увидите множество мест, где итераторы объявлены, особенно в циклах 'for'. Объявление итератора цикла или аргумента/функции функции итератора функции не имеет значения, все равно делается так же. –

+0

Чтение [хорошая ссылка] (http://en.cppreference.com/w/cpp/container/vector) также должно помочь. –

+0

В качестве альтернативы, сделайте как можно около любой [стандартной функции алгоритма] (http://en.cppreference.com/w/cpp/algorithm) и используйте шаблоны. –

ответ

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; 
} 
+0

Спасибо, Эрик. Это совсем не глупо, пример может быть очень полезен для начинающих, таких как я. – Dinosaur

+0

Обратите также внимание, что decltype необходимо, если, например, у вас есть функция шаблона, использующая два разных шаблонных типа в качестве аргументов и возвращающих, например. сумма двух переменных двух типов. Затем вы можете использовать decltype для возвращаемого значения (суммы). –

0

Это действительно зависит от типа итератора, который вам нужен. В общем случае это будет vector<int>::iterator. begin() определяется как:

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

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 итераторы предназначены быть переданы по значению, так что я избавилась от ссылки в функции подпись.

Смежные вопросы