Пример template function которая работает с forward_iterator
От: seego  
Дата: 05.03.05 19:32
Оценка:
Добрый день уважаемые!
Я новичок с++.
Разбираюсь в STL. (или по-крайней мене пытаюсь)

inline
void fillSomeStringContainer (StringContainer& _cMyCont, std::string* 
start, std::string* end)
{
   std::string* cur = start;
   while (cur != end)
     {
       _cMyCont[current-start] = *current;
       ++current;
     }
}


как создать template function для работы с любым forward_iterator?
Posted via RSDN NNTP Server 1.9
Re: Пример template function которая работает с forward_iter
От: korzhik Россия  
Дата: 05.03.05 20:28
Оценка:
Здравствуйте, seego, Вы писали:

S>как создать template function для работы с любым forward_iterator?


Стандарт предъявляет к каждой категории итератора свои требования.
Достаточно придерживатся этих требований при реализации функции и всё.
Вот краткий список операций допустимых для Forward Iterators
*iter
iter->member
++iter
iter++
iter1 == iter2
iter1 != iter2
iter1 = iter2


А вот пример функции из STL которая работает с любыми Forward Iterators
template<class ForwardIterator, class T>
void fill(ForwardIterator first, ForwardIterator last, const T& value);
{  
  for (; first != last; ++first)
    *first = value;
}
Re: Пример template function которая работает с forward_iter
От: Кодт Россия  
Дата: 06.03.05 08:52
Оценка:
Здравствуйте, seego, Вы писали:

S>
S>inline
S>void fillSomeStringContainer (StringContainer& _cMyCont, std::string* 
S>start, std::string* end)
S>{
S>   std::string* cur = start;
S>   while (cur != end)
S>     {
S>       _cMyCont[current-start] = *current;
S>       ++current;
S>     }
S>}
S>


S>как создать template function для работы с любым forward_iterator?


Применительно к твоей функции.
template<class Dst, // контейнер с произвольным доступом, судя по виду функции
         class SrcIt // итератор - обобщение указателя
        >
void fillSomeContainer(Dst& cont, Src start, Src end)
{
  // нам потребуется счётчик, т.к. измерять разность у Forward Iterator - это долго
  typedef typename iterator_traits<Src>::distance_type key_type; // или просто int
  key_type key = 0;
  while(start != end)
    cont[key++] = *(start++);
}

Кстати, ведущее подчёркивание в именах — зарезервировано Стандартом для нужд реализаций. Можно случайно нарваться на конфликт с диалектом языка или служебными именами библиотек.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.