我有C++ 11程序,需要从一系列值中选择一个值。每个范围都有一个分配的值以从中选择一个值。
以下是我的值范围以及为每个值分配的值。
1-10 = 5
11-14 = 13
15-20 = 17
21-28 = 24
29-36 = 31
37-47 = 43
48-52 = 50
53-60 = 53
61-68 = 65
因此,如您所见,如果输入介于1到10之间,则上面的5应该是返回值,如果输入介于11到14之间,则应该选择13。可以通过下面的程序通过if else语句的大量列表来达到上述要求。
#include <iostream>
// Following are return values to chosen based on which range the input value falls within
// 1-10 = 5
// 11-14 = 13
// 15-20 = 17
// 21-28 = 24
// 29-36 = 31
// 37-47 = 43
// 48-52 = 50
// 53-60 = 53
// 60-68 = 65
unsigned int GetValueBasedOnRange(const int value) {
int value_picked_from_appropriate_range = 0;
if (value > 1 && value < 10) {
value_picked_from_appropriate_range = 5;
} else if (value > 11 && value < 14) {
value_picked_from_appropriate_range = 13;
} else if (value > 15 && value < 20) {
value_picked_from_appropriate_range = 17;
} else if (value > 21 && value < 28) {
value_picked_from_appropriate_range = 24;
} else if (value > 29 && value < 36) {
value_picked_from_appropriate_range = 31;
} else if (value > 37 && value < 47) {
value_picked_from_appropriate_range = 43;
} else if (value > 48 && value < 52) {
value_picked_from_appropriate_range = 50;
} else if (value > 53 && value < 60) {
value_picked_from_appropriate_range = 53;
} else if (value > 61 && value < 68) {
value_picked_from_appropriate_range = 65;
}
return value_picked_from_appropriate_range;
}
int main() {
unsigned int value_within_a_range = 42;
std::cout << GetValueBasedOnRange(value_within_a_range) << std::endl;
}
上面的程序可以正常工作,但是很大的语句列表是不好的。同样,如果将来会有更多的值和范围,它们会影响if else逻辑。在C++ 11中,有没有办法我可以建立一个不错的静态查找表来实现此目的,而不必另外编写?我可以在头文件中声明输出值的静态表吗?在C++ 11中执行此操作的一些聪明方法?我大概可以尝试
std::map<std::pair<unsigned int, unsigned int>, unsigned int>
吗?但是,想知道使用该方法还是什至更简单的方法。PS:我不确定它是否称为查询表或其他东西。但是,它会为特定的一对值/范围的值选择一个硬编码的值。
最佳答案
如果索引具有特殊含义,则此方法可能会有所帮助。初始化在编译时完成,因此在执行期间为O(1):
#include <array>
template<typename ARRAY>
constexpr void fill_range(ARRAY& array, int first, int last, int value)
{
for(int i = first; i <= last; ++i)
array[i] = value;
}
constexpr std::array<int, 69> make_table()
{
std::array<int, 69> a {0};
fill_range(a, 1, 10, 5);
fill_range(a, 11, 14, 13);
fill_range(a, 15, 20, 17);
fill_range(a, 21, 28, 24);
fill_range(a, 29, 36, 31);
fill_range(a, 37, 47, 43);
fill_range(a, 48, 52, 50);
fill_range(a, 53, 60, 53);
fill_range(a, 61, 68, 65);
return a;
}
constexpr auto arr = make_table();
int main()
{
return arr[65];
}
关于c++ - 如何使用C++ 11声明静态查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63194960/