c ++:通过单个函数调用替换多个索引相等性测试

时间:2016-02-29 14:16:53

标签: c++

在c ++ / c ++ 11中,替换表单的多重比较的正确方法是什么:

if(isIndexToFind==index1 || isIndexToFind==index2 ...)

表格不那么混乱:

if(isIn(indexToFind,index1,index2,...))

对于不同数量的参数index1,index2,...这段代码属于一个数字,所以我想要的东西几乎和直接比较一样有效。

可能有趣的是,添加index1,index2是const静态值,因此基于变量模板的解决方案可能会引起关注吗?

4 个答案:

答案 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)

因为到目前为止所有的答案都是线性搜索复杂度(arraysvectors等),我建议使用具有对数复杂度的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){
   // ...