環境
- C++11
- Visual Studio 2018
質問内容
find_if を使って、std::vector の特定の範囲に指定した値が存在するかどうか判定したいのですが、意図通りに動作しません。
なにが間違っているかご指摘いただけないでしょうか。
cpp
1 template <class InputIterator, class Predicate> 2 InputIterator find_if(InputIterator first, 3 InputIterator last, 4 Predicate pred);
を使うと、[first, last) の範囲で pred が true になるイテレータを返すという認識だったのですが、以下のように vec の範囲 [3, 6) に値1は存在しないのに、結果が true となります。
cpp
1 2 std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 3 int begin = 3, end = 6; 4 int target = 1; 5 6 // vec の [3, 6) の範囲に値1が存在するかどうか 7 bool contains = std::find_if( 8 vec.begin() + begin, 9 vec.begin() + end, 10 [target](int v) { return v == target; }) 11 != vec.end(); 12 std::cout << std::boolalpha << contains << std::endl;
解決方法
maisumakun さんにご指摘いただいた点が問題でした。
ご回答ありがとうございます。
std::find_ifに渡した末端がvec.begin() + endなので、見つからなかったときはvec.end()ではなくvec.begin() + endになるかと思います。
cpp
1 std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 2 int begin = 3, end = 6; 3 int target = 1; 4 5 // vec の [3, 6) の範囲に値1が存在するかどうか 6 auto first = vec.begin() + end, last = vec.begin() + end; 7 bool contains = std::find_if( 8 first, 9 last, 10 [target](int v) { return v == target; }) 11 != last; 12 std::cout << std::boolalpha << contains << std::endl;
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/09 11:08 編集