Возможно ли это сделать с помощью 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::array
(и std::vector
) является итератором с произвольным доступом и поддерживает разницу; так что вы можете вычесть итератор cbegin()
, получив индекс
Но это не значит, что вы можете избежать al oop: l oop находится внутри std::find()
.
См. Также ответ от cigien , который также работает с контейнерами, не поддерживающими итераторы с произвольным доступом: вы можете использовать std::distance()
.
Но в случае контейнера, поддерживающего итератор с неслучайным доступом , Полагаю, что std::distance()
может ввести второй l oop. Итак, в этом случае, я полагаю, лучше, если вы напрямую напишете один l oop.