2016-03-30 4 views
0

Мне нужно создать общую функцию, которая будет работать для векторов, связанных списков и двойных связанных списков. Я хочу использовать итератор для анализа, чтобы найти, является ли val в векторе, связанном списке или двойном связанном списке. Я просто не знаю, как объявить общий итератор. Ниже приведена моя попытка декларации.Templated Iterator declaration

template <class Container, class T> 
void findValue(Container &x, const T &val){ 
std::x<T>::iterator it; 
} 
+0

Один из способов будет проходить 'станд :: список ' как контейнер, и используйте 'контейнер :: iterator'. – immibis

+1

Есть ли причина не использовать 'std :: find'? –

+0

@PeteBecker Ну, конечная цель этой функции состоит в том, чтобы увидеть, существует ли val уже, и если она выполняет функцию, вставьте val прямо рядом, где она уже существует. Так что если val равно 3, {2,4,3,5} будет {2,4,3,3,5}. И я не думаю, что поиск вернет позицию. – Lin0523

ответ

0

Поскольку контейнеры C++ определить вложенный тип iterator, вы можете использовать typename Container::iterator объявить итератор в вашей findValue функции (хотя auto будет работать так же хорошо). Также нет необходимости принимать T в качестве отдельного параметра шаблона, так как вы можете использовать typename Container::value_type.

template<typename Container> 
void findValue(Container& x, const typename Container::value_type & val) 
{ 
    // could use 'typename Container::iterator' instead of 'auto' 
    for (auto it = begin(x); it != end(x); ++it) 
    { 
     if (*it == val) 
     { 
      std::cout << "found " << val << std::endl; 
      break; 
     } 
    } 
} 
+0

Спасибо, что отлично работали – Lin0523