假设我有一个字符串向量,我想找到所有以 开头的字符串,'a'
所以我可以这样做:
struct cmp {
bool operator()( const std::string &s, char c ) const { return s.front() < c; }
bool operator()( char c, const std::string &s ) const { return s.front() < c; }
};
std::vector<std::string> strings;
...
std::sort( strings.begin(), strings.end() );
auto range = std::equal_range( strings.begin(), strings.end(), 'a', cmp{} );
...
这种方法容易出错,因为容易出错(例如我认为它应该c < s.front()
在第二种方法中)并且有代码重复。
那么是否可以使用通用 lambda 而不是使用 2 种方法的结构来实现比较功能?
更一般的问题,为什么要比较的值必须作为参数传递给std::lower_bound
,std::upper_bound
什么std::equal_range
时候它可以很容易地被 lambda 捕获或传递给比较结构,那么这个问题就根本不存在了?
std::equal_range
如果不需要价值,它如何工作?
struct cmp {
cmp( char lc ) : c( lc ) {}
bool operator()( const std::string &s ) const { return s.front() < c; }
char c;
};
std::vector<std::string> strings;
...
std::sort( strings.begin(), strings.end() );
auto range = std::equal_range( strings.begin(), strings.end(), cmp{'a'} );