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类似,此处不多讲了。