如何在不使用循环的情况下获取 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。
如何在没有 运行 任何循环的情况下获取 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。