質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

4164閲覧

lower_boundでイテレータの範囲内から指定した値以上の最小の要素が見つからなかった場合の戻り値を確認したいです。

sumachu

総合スコア22

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/05 00:15

AOJの問題のALDS1_4_Bに対して、以下のコードを記述しました。

C++

1#include <bits/stdc++.h> 2using namespace std; 3int main() 4{ 5 int n; 6 cin >> n; 7 vector<int> s(n); 8 for (int i = 0; i < n; i++) 9 { 10 cin >> s[i]; 11 } 12 13 int q; 14 cin >> q; 15 int sum = 0; 16 for (int i = 0; i < q; i++) 17 { 18 int t; 19 cin >> t; 20 if (lower_bound(s.begin(), s.end(), t) != s.end()) 21 { 22 sum++; 23 } 24 } 25 cout << sum << endl; 26} 27

このコードに対して以下の入力例を与えると、10が出力されます。(正解は8です。)


15
0 0 1 1 2 2 3 3 3 5 6 6 8 9 9
10
8 4 6 5 0 2 1 7 9 3


私はイテレータの範囲内から指定した値以上の最小の要素が見つからなかった場合、lower_bound(s.begin(), s.end(), t)の戻り値はs.end()だと理解しています。したがって、if (lower_bound(s.begin(), s.end(), t) != s.end())で、イテレータの範囲内から指定した値以上の最小の要素が見つかった場合のみ、sumをインクリメントしています。しかし、デバッグしてみると、上記入力例の4や7もカウントしていることを確認しました。lower_bound(s.begin(), s.end(), t)の戻り値はs.end()ではないのでしょうか。それとも、他に何か別の要因で不正解になっているのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

0 0 1 1 2 2 3 3 3 5 6 6 8 9 9
に含まれる最大の数は9ですが,対して
8 4 6 5 0 2 1 7 9 3
の各要素は全て9以下です.なので,lower_boundの結果が「見つからない」にはなりません.

投稿2020/01/05 00:35

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/01/05 00:37

あと,やってることがリンク先の題意とは違うような…?
sumachu

2020/01/05 13:03

ご回答ありがとうございます!ご指摘の通り、問題の題意を満たすためには、 if (*lower_bound(s.begin(), s.end(), t) == t) sum++; とするか、もしくはlbinary_searchを使うべきですね。lower_boundの挙動を勘違いしていました。ご指摘のおかげで誤りに気付くことができました。
guest

0

ベストアンサー

lower_bound(s.begin(), s.end(), t)の戻り値はs.end()ではないのでしょうか。

そーですよ。

C++

1#include <iostream> 2#include <vector> 3#include <algorithm> 4 5int main() { 6 using namespace std; 7 vector<int> vec = { 1, 2, 3 }; 8 if ( lower_bound(vec.begin(), vec.end(), 4) == vec.end() ) { 9 cout << "yes, lower_bound() returns end()" << endl; 10 } 11}

lower_bound じゃなく binary_search じゃないと一致する要素は探せないんちゃいます?

C++

1#include <iostream> 2#include <vector> 3#include <algorithm> 4 5int main() { 6 using namespace std; 7 vector<int> vec = { 0, 0, 1, 1, 2, 2, 3, 3, 3, 5, 6, 6, 8, 9, 9 }; 8 int sum = 0; 9 for ( int n : { 8, 4, 6, 5, 0, 2, 1, 7, 9, 3 } ) { 10 if ( binary_search(vec.begin(), vec.end(), n ) ) { 11 ++sum; 12 } 13 } 14 cout << sum << endl; 15}

投稿2020/01/05 03:01

編集2020/01/05 03:06
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumachu

2020/01/05 13:03

ご回答ありがとうございます!ご指摘の通り、問題の題意を満たすためには、 if (*lower_bound(s.begin(), s.end(), t) == t) sum++; とするか、もしくはlbinary_searchを使うべきですね。lower_boundの挙動を勘違いしていました。ご指摘のおかげで誤りに気付くことができました。
episteme

2020/01/05 19:19

> if (*lower_bound(s.begin(), s.end(), t) == t) sum++; lower_bound が s.end() を返したとき *s.end() しちゃうのでコレはマズい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問