Modern C++ 之二 -- 标准库使用小技巧(1)

std::sort 、std::lower_bound

std::sort函数常用来给vector或者数组排序,c++11后使用lambda更加简洁

//比较的结构体
struct st_cmp_data
{
    std::string strData;
    int nData;
};

//自定义比较算法,写在结构体里面
struct st_less_operator
{
    bool operator ()(const st_cmp_data& a, const st_cmp_data & b) const
    {
        return a.strData.compare(b.strData) < 0;
    }
};

//结构体,重载operator ()
struct st_less_operator
{
    bool operator ()(const st_cmp_data& a, const st_cmp_data & b) const
    {
        return a.strData.compare(b.strData) < 0;
    }
};

//小于比较函数
bool less_compare(const st_cmp_data& a, const st_cmp_data & b)
{
    return a.strData.compare(b.strData) < 0;
}

void test_vector_sort()
{    
    std::vector<st_cmp_data> vtTest = {{"123", 2}, {"234", 1}, {"345", 4}};
    
    //1、小到大排序, 用结构体
    std::sort(vtTest.begin(), vtTest.end(),  st_less_operator());
    
    //2、小到大排序, 用自定义函数
    std::sort(vtTest.begin(), vtTest.end(),  less_compare);
    
    //3、从大到小排序 c++11之后, 可以使用lambada
    //使用lambda更加简洁
    std::sort(vtTest.begin(), vtTest.end(), [](const st_cmp_data& a, const st_cmp_data & b ){
        return a.strData.compare(b.strData) > 0;
    });
    
    std::cout<<"test_vec_compare end"<<std::endl;
}

std::lower_bound函数是返回一个大于或者等于value的迭代器, 如果没找到则返回last。此函数使用二分查找,所以使用时数组或者vector必须先排好序。使用lambda使这个函数更加灵活简洁 。

void test_lowwer_bound()
{
    //已经排序好的vector
   std::vector<st_cmp_data> vtTest = {{"123", 2}, {"234", 1}, {"345", 4}, {"345", 4}, {"785", 5}};

    st_cmp_data valToFind = {"345",4};
    //1、查找valToFind,旧的方法
    //auto lower1 = std::lower_bound(vtTest.begin(), vtTest.end(), valToFind, st_less_operator());
    //modern c++使用lambda
    auto lower1 = std::lower_bound(vtTest.begin(), vtTest.end(), valToFind, [] (const st_cmp_data& a, const st_cmp_data & b){
        return a.strData.compare(b.strData) < 0;
    });
    lower1 != vtTest.end()
    ? std::cout << "valToFind index = " << lower1 - vtTest.begin()
    : std::cout << "valToFind not foound" ;
    std::cout<<std::endl;
    
    //2、假如现在要查找的是一个string,同样用lambda
    std::string strToFind ="345";
    auto lower2 = std::lower_bound(vtTest.begin(), vtTest.end(), strToFind, [] (const st_cmp_data& a, const std::string & b) {
        return a.strData.compare(b) < 0;
    });
    
    lower2 != vtTest.end()
    ? std::cout << "strToFind index = " << lower1 - vtTest.begin()
    : std::cout << "strToFind not foound" ;
    std::cout<<std::endl;
    
    std::cout << "test_lowwer_bound end \n";
}

最终 output:
valToFind index = 2
strToFind index = 2
test_lowwer_bound end

std::upper_bound 与 std::lower_bound类似,此处不多讲了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值