33

これは基本的に私がやりたいことです:

bool special_compare(const string& s1, const string& s2)
{
    // match with wild card
}

std::vector<string> strings;

strings.push_back("Hello");
strings.push_back("World");

// I want this to find "Hello"
find(strings.begin(), strings.end(), "hell*", special_compare);

// And I want this to find "World"
find(strings.begin(), strings.end(), "**rld", special_compare);

しかしstd::find、残念ながらそのようには機能しません。では、STLのみを使用して、どうすればこのようなことができますか?

4

6 に答える 6

36

あなたのコメントに基づいて、おそらくこれを探しています:

struct special_compare : public std::unary_function<std::string, bool>
{
  explicit special_compare(const std::string &baseline) : baseline(baseline) {}
  bool operator() (const std::string &arg)
  { return somehow_compare(arg, baseline); }
  std::string baseline;
}

std::find_if(strings.begin(), strings.end(), special_compare("hell*"));
于 2013-01-14T16:37:11.110 に答える
12

使用する必要がある関数は this :です。比較関数を使用しないためですstd::find_ifstd::find

しかし、その後は価値std::find_ifを取りません。あなたはを渡して両方を比較しようとしていますが、これは私を混乱させます。とにかく、ドキュメントを見てください。使用法の違いを参照してください。

auto it1 = std::find(strings.begin(), strings.end(), "hell*");
auto it2 = std::find_if(strings.begin(), strings.end(), special_compare);

それが役立つことを願っています。

于 2013-01-14T16:24:10.253 に答える
10

C++11コンパイラを使用していないstd::find_if()限り、これは使いにくいです。そのため、コンパレータ関数で検索する値をハードコーディングしたり、ファンクター オブジェクトを実装したりする必要はありませんが、ラムダ式でそれを行うことができます。

vector<string> strings;

strings.push_back("Hello");
strings.push_back("World");

find_if(strings.begin(), strings.end(), [](const string& s) {
    return matches_wildcard(s, "hell*");
});

次に、matches_wildcard() をどこかに書き込みます。

于 2013-01-14T16:36:16.197 に答える
7

まだ誰も言及std::bindしていないので、これを提案します

#include <functional>

bool special_compare(const std::string& s, const std::string& pattern)
{
    // match with wild card
}

std::vector<std::string> strings;
auto i = find_if(strings.begin(), strings.end(), std::bind(special_compare, std::placeholders::_1, "hell*"));
于 2013-01-14T17:07:27.440 に答える
6

C++11 ラムダの場合:

auto found = find_if(strings.begin(), strings.end(), [] (const std::string& s) { 
    return /* you can use "hell*" here! */;
});

C++11 ラムダを使用できない場合は、自分で関数オブジェクトを作成できます。型とオーバーロード演算子 () を作成します。

于 2013-01-14T16:36:04.667 に答える