可以說我有一個字符串矢量,我想找到的所有字符串,與'a'
開始,這樣我就可以做到這一點:的std :: equal_range與拉姆達
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
通過時,它可以很容易地通過拉姆達被捕獲或傳遞給比較結構,然後這個問題不會在那裏呢?
如果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'});
如果你願意通過一個'''代替''a'',那麼一個lambda採取兩個字符串和比較他們的第一個字符將工作。否則,具有兩個重載的命名類看起來像對我來說是最乾淨的解決方案。請注意,儘管目前編寫的第二個重載是錯誤地進行比較的。 –
@IgorTandetnik這很明顯,但它可能不是字符串,而是一個按部分排序的對象,所以我不想創建整個對象只是爲了將它用作關鍵字。 – Slava
你可以使用'std :: partition_point'。 –