Знайти індекс ітератора у контейнері STL - потрібна функція шаблону

Я хочу, щоб функція з інтерфейсом виглядала так:

template int find_index (const T& list, const R& value);

Як я знаю, у STL є find() , що повертає ітератор. Мені потрібно повернути індекс ітератора (навіть для неіндексованих контейнерів, таких як std :: list ). Я спробував цей код:

template
int find_index (const T& list, const R& value)
{
    int index = 0;
    for (T::const_iterator it = list.begin(); it != list.end(); it++, index++)
        if ((*it) == value)
            return index;
    return -1;
}

Але компілятор показує помилку в it - здається, це не дозволено отримати const_iterator з шаблону typename. Чи можу я обійти це?

У гіршому випадку я можу передати початкові та завершальні ітератори для аргументів found_index, але це виглядає не так добре. Будемо вдячні за елегантне рішення.

3

1 Відповіді

for (typename T::const_iterator it = list.begin(); it != list.end(); ++it, ++index)

повинен вирішити вашу проблему.

При використанні залежних типів (типів, що залежать від параметрів шаблону), компілятор не знає, що тип const_iterator є типом, поки він не буде екземплятором шаблону з конкретним типом, він також може бути просто статичною змінною або іншою. Використовуючи ключове слово typename , ви повідомляєте йому, що const_iterator дійсно є типом.

У C ++ 11 ви також можете обійти проблему typename з використанням ключового слова auto :

for (auto it = list.begin(); it != list.end(); ++it, ++index)

Якщо у вас вже є ітератор (можливо, з якоїсь іншої операції), ви також можете просто обчислити відстань від списку, починаючи з цього ітератора:

#include 

int index = std::distance(list.begin(), it);

Але оскільки це має лінійну складність для std :: list , використання вашої саморобної функції find_index є кращим уявленням, ніж std :: find за яким слідує std :: distance , принаймні продуктивність.

11
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147