質問事項
- Set.lower_bound(20)の返り値は、アドレスなのかイテレーター(配列の番号)のどちらでしょうか
- もし上記の回答が、
イテレーター
である場合、(*itr)で値を取り出せるのはSet特有のルールだからでしょうか
※補足:a[10]=5を例にすると、要素は「5」、アドレスは「&a+10」、イテレーターは「10」の認識です。
※補足2: 3-17.setを勉強中の質問です。こちらを見る限り、1の質問に対しては、イテレーターを返す
という説明になっております。
事実と、私の期待値
添付のプログラムを実行し、cout <<
の出力時点では事実
として以下の状況になりました。
- itr2の値は46 : デバッガ参照 - (*itr2)の値は46 : 標準出力
これに対して、私の認識は以下の通りです。
- itr2の値は1のはず : {15,46}に対し、20以上のイテレーター(配列の番号)は1なので、`デバッガは嘘をついている`と判断 - Set.lower_boundの返り値はイテレーターを返す - 一方で、ただの`配列a[i]`へのlower_boundは、`アドレス`を返す(一貫性のないこともあるんでしょうか) - (*itr2)は、アドレス値が「1」の要素を返すので、変なことになりそう。
デバッガも嘘をつくようなことがあるのでしょうか...?
プログラム
C++
1#include <iostream> 2#include <set> 3using namespace std; 4 5int main() { 6 // 例 1: set に対して色々な操作を行う(1 個目は "End"、2 個目は "46" と出力される) 7 set<int> Set; 8 Set.insert(37); // その時点での Set の要素は {37} 9 Set.insert(15); // その時点での Set の要素は {15, 37} 10 Set.insert(37); // その時点での Set の要素は {15, 37} 11 Set.erase(37); // その時点での Set の要素は {15} 12 Set.insert(46); // その時点での Set の要素は {15, 46} 13 auto itr2 = Set.lower_bound(20); 14 cout << (*itr2) << endl; 15 16 return 0; 17}
>イテレーター(配列の番号)
イテレータは要素番号ではありませんよ
>イテレーター(配列の番号)は1なので、`デバッガは嘘をついている`と判断
なので、嘘なんてついていません。
VisualStudioのデバッガだとitr2が指す要素のアドレスも見れますよ。
ありがとうございます!そう考えるとスッキリしそうです
ちなみにですが、イテレーターはアドレス値と同じ意味であっていますでしょうか?
デバッガを見ると、アドレスの番号になっていない点が気になりました。
(auto itr2 = Set.lower_bound(20);でitr2の値は「46]になっている。)
内部的にはポインタで実装されているでしょうけれど、イテレータがポインタそのものである保証はありません。
ポインタのような別のものです。
vectorのような内部の要素がメモリ上で連続しているな構造ならポインタでもなんとかなりますが、setは連続していませんし…
auto itr2 = Set.lower_bound(20);
cout << typeid(itr2).name() << endl;
として何者か表示するとポインタではないことがわかります。gccではデマングルが必要ですが。
class std::_Tree_const_iterator<class std::_Tree_val<struct std::_Tree_simple_types<int> > >
ありがとうございます!
イテレーターは自分の知っているものとは異なるものがあることに気づけました!
イテレーター・デマングルについて、ちょっと実力が足りていないようなので、以下も含めて、いくつか調べてみようと思います!
デマングル:https://gintenlabo.hatenablog.com/entry/20100116/1263681145
回答1件
あなたの回答
tips
プレビュー