Как получить тип значения из итератора в C ++? - PullRequest
30 голосов
/ 19 октября 2010

Мой вопрос, безусловно, простой для тех, кто знаком с синтаксисом C ++.Я только изучаю c ++, и это некая домашняя работа .

template<typename Iter>
void quickSort(Iter begin, Iter end)
{        
    //..
    auto pivot = * ( begin + (end - begin)/2 );
    //..
}

В сводной таблице должно содержаться значение из центра интервала [начало, конец].Ite Код, который я там написал, работает, но auto - это ключевое слово из нового стандарта языка.Как это сделать по старинке?Что писать вместо auto?

Ответы [ 2 ]

31 голосов
/ 19 октября 2010

typename std::iterator_traits<Iter>::value_type

Это будет работать, если ваш шаблон создается с Iter в качестве типа указателя.

Кстати, typename не является частью самого типа. Он сообщает компилятору, что value_type действительно является типом. Если это было имя функции или статического члена данных, то это влияет на синтаксис. Компилятор не обязательно знает, что это такое, поскольку специализация iterator_traits для Iter может не отображаться при компиляции шаблона.

0 голосов
/ 19 октября 2010

Ответ Стива верен; в C ++ 98 вы должны использовать std :: iterator_traits или вы можете использовать Iter :: value_type, если вы знаете, что итератор имеет этот typedef (например, происходит от std :: iterator) Однако в вашем коде есть еще одна проблема: обычно вы не можете просто разделить итераторы. Это работает с указателями, конечно, но не в более общем случае. Более общий подход был бы:

Iter itPivot = std::advance(begin, std::distance(begin, end)/2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...