私はノード構造体を持っています
struct Node{CString text, int id;};
ソートされたベクトルで。
ベクトルのバイナリ検索を実行して要素を見つけるアルゴリズムに関数があるかどうか疑問に思っています。
私はノード構造体を持っています
struct Node{CString text, int id;};
ソートされたベクトルで。
ベクトルのバイナリ検索を実行して要素を見つけるアルゴリズムに関数があるかどうか疑問に思っています。
std::binary_search()
コンテナに値が存在するかどうかを教えてくれます。
std::lower_bound()/std::upper_bound()
値の最初/最後のオカレンスへの反復子を返します。
operator<
これらのアルゴリズムが機能するには、オブジェクトを実装する必要があります。
はい、「binary_search」 std::binary_search という関数があります
最初、最後、および値または述語を指定します。
サンプルはこちら
これをMartin York のoperator== と組み合わせれば問題ないはずです (代わりに、述語ファンクターを書くこともできます
ソートされた vector<Node>
ではなく、マップを使用しないのはなぜですか。仕分けコンテナです。そのため、 std::find() を介してこれに対して行われた検索は、自動的に二分検索と同じプロパティを持ちます。
std::equal_range
並べ替えられたベクトル内の要素の範囲を検索するために 使用します。指定した引数に等しい要素のベクトルの範囲を指定して、イテレータstd::equal_range
の a を返します。std::pair
範囲が空の場合、アイテムはベクターに含まれておらず、範囲の長さからアイテムがベクターに出現する回数がわかります。
の代わりに int を使用した例を次に示しますstruct Node
。
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main(int argc, const char * argv[])
{
std::vector<int> sorted = { 1, 2, 2, 5, 10 };
auto range = std::equal_range(sorted.begin(), sorted.end(), 20);
// Outputs "5 5"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
range = std::equal_range(sorted.begin(), sorted.end(), 5);
// Outputs "3 4"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
range = std::equal_range(sorted.begin(), sorted.end(), -1);
// Outputs "0 0"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
return 0;
}
これを機能させるには、 forstruct Node
を提供するか、コンパレータを に渡す必要があります。これを行うには、構造体を比較する引数としてラムダを指定します。operator <
struct Node
std::equal_range
std::equal_range
std::vector<Node> nodes = { Node{"hello", 5}, Node{"goodbye", 6} };
Node searchForMe { "goodbye", 6 };
auto range = std::equal_range(nodes.begin(), nodes.end(), searchForMe,
[](Node lhs, Node rhs) { return lhs.id < rhs.id; });