Подтвердить что ты не робот

Как получить тип значения из итератора в С++?

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

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

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

4b9b3361

Ответ 1

typename std::iterator_traits<Iter>::value_type

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

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

Ответ 2

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

Iter itPivot = std::advance(begin, std::distance(begin, end)/2);