您在尋找std::lower_bound
,std::upper_bound
和std::equal_range
,它們需要一個輸入範圍,一個搜索值和一個可選的比較器,並要求根據比較器對範圍進行排序。
爲了您的具體的例子,我會使用std::lexicographical_compare
的比較:
#include <algorithm>
#include <iterator>
struct IdCmp
{
bool operator()(const Foo & lhs, const Foo & rhs) const
{
return std::lexicographical_compare(std::begin(lhs.id), std::end(lhs.id),
std::begin(rhs.id), std::end(rhs.id));
}
};
int main()
{
Foo a[100]; // populate
Foo b = make_needle();
auto p = std::equal_range(std::begin(a), std::end(a), b, IdCmp());
/* The elements with key equal to that of b are in [p.first, p.second). */
}
如果你希望能夠直接搜索字符串,你的比較必須是可調用的異質同一個Foo
參數和一個字符串參數。例如:
struct IdCmp
{
bool operator()(const Foo & lhs, const Foo & rhs) const
{
return std::lexicographical_compare(std::begin(lhs.id), std::end(lhs.id),
std::begin(rhs.id), std::end(rhs.id));
}
bool operator()(const Foo & lhs, const char * id) const
{
return std::lexicographical_compare(std::begin(lhs.id), std::end(lhs.id),
id, id + 8);
}
bool operator()(const char * id, const Foo & rhs) const
{
return std::lexicographical_compare(id, id + 8,
std::begin(rhs.id), std::end(rhs.id));
}
};
現在您可以搜索:
std::lower_bound(std::begin(a), std::end(a), "ABCD1234", IdCmp())
爲'find_if'接口是無用的二分查找。如果這是一場比賽,那很好。但是如果謂詞表示它不匹配,那麼搜索應該在下一個當前點之前還是之後查找? – 2014-11-23 20:51:45
還有一個明智的方向嗎?假設條件是'isPrime(int x)',第一個值'x'是100.現在呢? – MSalters 2014-11-24 11:12:32
也許接口不完全一樣,但返回一個int指示方向。 – user877329 2014-11-24 11:18:13