在c ++ / c ++ 11中,替换表单的多重比较的正确方法是什么:
if(isIndexToFind==index1 || isIndexToFind==index2 ...)
表格不那么混乱:
if(isIn(indexToFind,index1,index2,...))
对于不同数量的参数index1,index2,...这段代码属于一个数字,所以我想要的东西几乎和直接比较一样有效。
可能有趣的是,添加index1,index2是const静态值,因此基于变量模板的解决方案可能会引起关注吗?
答案 0 :(得分:3)
您可以编写类似
的内容#include <iostream>
#include <algorithm>
#include <initializer_list>
template <class T>
bool one_of( const T &value, std::initializer_list<T> lst )
{
return std::any_of( lst.begin(), lst.end(), [&]( const T &x ) { return value == x; } );
}
int main()
{
std::cout << one_of( 1, { 2, 3, 1, 5 } ) << std::endl;
std::cout << one_of( 4, { 2, 3, 1, 5 } ) << std::endl;
}
答案 1 :(得分:1)
你可以使用std :: any_of。
v.push_back(index1);
v.push_back(index2);
if (std::any_of(v.cbegin(), v.cend(), [](int& index){return index==isIndexToFind;}))
如果您真的想使用您提到的表单,那么可变参数模板也可以使用。类似的东西:
#include <iostream>
#include <vector>
template<typename T>
bool isIn(T indexToFind,T first_index) { return indexToFind==first_index; }
template<typename T,typename ... Tail>
bool isIn(T indexToFind,T first_index, Tail... remaining_indices)
{
if (indexToFind==first_index)
return true;
else
return isIn(indexToFind,remaining_indices...);
}
const static int index1{23};
const static int index2{34};
const static int index3{88};
const static int index4{24};
const static int index5{21};
int main()
{
bool found = isIn(621,index1,index2,index3,index4,index5);
if (found) {
std::cout << "Index was found\n";
}
else {
std::cout << "Index was not found\n";
}
return 0;
}
答案 2 :(得分:1)
因为到目前为止所有的答案都是线性搜索复杂度(arrays
,vectors
等),我建议使用具有对数复杂度的std::set
-UPS。例如:
#include <iostream>
#include <set>
int main()
{
std::set<int> set{ 5, 6, 1, 2 };
std::cout << (set.count(6) > 0) << std::endl;
std::cout << (set.count(3) > 0) << std::endl;
return 0;
}
答案 3 :(得分:0)
将数组用作这种类型的查找表是很常见的。
假设您的指数为int
:
std::array<int, N> indicesTable{{index1, index2, ...}};
bool in = std::find(std::begin(indicesTable), std::end(indicesTable), isIndexToFind) != std::end(indicesTable);
if (in)
// ...
如果按排序顺序存储索引,可以使用std::lower_bound
pr std::equal_range
在查找表上执行二进制搜索:
auto iter = std::lower_bound(std::begin(indicesTable), std::end(indicesTable), isIndexToFind);
bool in = iter != std::end(indicesTable) && *iter == isIndexToFind;
if (in){
// ...