Как получить индекс элемента в std :: array без использования al oop? - PullRequest
1 голос
/ 02 августа 2020

Как я могу получить индекс элемента в std::array без выполнения каких-либо циклов?

#include <iostream>
#include <array>

std::array<int, 10> some_array = { 89, 56, 78, 96, 4, 34, 77, 2, 48, 3};

unsigned int GetIndexOfValue(unsigned int some_value) {
    // How get the index of some_value here without running a loop?
}

int main() {
    unsigned int some_value = 34;
    std::cout << "The index of value passed is " << GetIndexOfValue(some_value) << std::endl;
}

Можно ли сделать это с помощью std::find?

Ответы [ 3 ]

3 голосов
/ 02 августа 2020

Вы можете использовать функции из заголовка <algorithm>, чтобы избежать написания необработанного l oop, например:

unsigned int GetIndexOfValue(unsigned int some_value) {
    return std::distance(std::begin(some_array),
             std::find(std::begin(some_array), std::end(some_array), some_value));
}

Вот demo .

1 голос
/ 02 августа 2020

Возможно ли это сделать с помощью std :: find?

Да: с std::array это возможно.

std::array<int, 10> some_array = { 89, 56, 78, 96, 4, 34, 77, 2, 48, 3};

auto idx =   std::find(some_array.cbegin(), some_array.cend(), 34)
           - some_array.cbegin();

std::cout << "The index of value passed is " << idx << std::endl;

С std::find() вы получаете итератор, который в случае std::arraystd::vector) является итератором с произвольным доступом и поддерживает разницу; так что вы можете вычесть итератор cbegin(), получив индекс

Но это не значит, что вы можете избежать al oop: l oop находится внутри std::find().

См. Также ответ от cigien , который также работает с контейнерами, не поддерживающими итераторы с произвольным доступом: вы можете использовать std::distance().

Но в случае контейнера, поддерживающего итератор с неслучайным доступом , Полагаю, что std::distance() может ввести второй l oop. Итак, в этом случае, я полагаю, лучше, если вы напрямую напишете один l oop.

1 голос
/ 02 августа 2020
std::find(some_array.begin(), some_array.end(), some_value) - some_array.begin()

подойдет (не проверено).

...