如何在不使用循环的情况下获取 std::array 中的项目索引?

How to get the index of an item in std::array without using a loop?

如何在没有 运行 任何循环的情况下获取 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 来实现?

std::find(some_array.begin(), some_array.end(), some_value) - some_array.begin()

应该可以解决问题(未测试)。

Is it possible to do it using 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() 迭代器得到索引

但这并不意味着您可以避免循环:循环在 std::find().

另请参阅 ,它也适用于不支持随机访问迭代器的容器:您可以使用 std::distance()

但是,如果容器支持非随机访问迭代器,我想 std::distance() 可以引入第二个循环。所以,在这种情况下,我想如果你直接写一个循环会更好。

您可以使用 <algorithm> header 中的功能,这样就可以避免编写原始循环,如下所示:

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