- ベストアンサー
std::lower_boundについて
- std::lower_boundを使用して変数pをソート済み配列IntArrayに挿入する方法が分からない
- lower_boundの使用方法やコードの修正方法を教えてほしい
- 特殊ケースでの問題のため、int* pをintに修正したり、挿入後に再度ソートする方法は不要
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 上記のように使用すればこの場合だと変数pを挿入する位置が返ってくるのでしょうか? やってみればわかることかと。 #include <iostream> #include <algorithm> #include <vector> bool cmp( const int* lhs, const int* rhs ) { return *lhs < *rhs; } int main() { std::vector<int*> IntArray; IntArray.push_back( new int( 0 ) ); IntArray.push_back( new int( 2 ) ); IntArray.push_back( new int( 1 ) ); IntArray.push_back( new int( 6 ) ); IntArray.push_back( new int( 5 ) ); IntArray.push_back( new int( 7 ) ); std::sort(IntArray.begin(), IntArray.end(), &cmp); int* p = new int(4); std::vector<int*>::iterator pos = std::lower_bound(IntArray.begin(), IntArray.end(), p, &cmp); IntArray.insert(pos, p); for ( int i = 0; i < IntArray.size(); ++i ) { std::cout << *IntArray[i] << std::endl; } }
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
おおざっぱにいえば lower_bound で返ってくるのは 指定した値より小さくない最初の位置 だから, これでいけるはずです. lower_bound で返ってきたところにいれて, それ以降をうしろにずらせばいいと思う.
お礼
ありがとうございます。 No2さんの回答をもとに実行してみたところ期待通りの動作をいたしました。 今回の件で頭で考えただけで作った気になっていた自分を戒めたいと思います。 ありがとうございました。
お礼
申し訳ありません。 先ほど試したところ、確かに挿入したいところのイテレータが返ってきていました。 std::lower_boundが中でどのような処理をやっているのかいまいちわからず、他の作業にいっぱいいっぱいで頭で考えただけで手を動かすことをしなかったことは反省したいと思います。 第3引数でポインタを渡しているのでポインタで比較されてしまうと考えていたのですが内部比較は第4引数で渡された関数が使用されるのですね・・・。 ありがとうございました。