teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記2

2019/03/01 02:41

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -53,4 +53,80 @@
53
53
 
54
54
  実際に何か作品を作ってみてください。
55
55
 
56
- 参考: [ロジック](http://blog.livedoor.jp/crackstars/archives/992541.html)
56
+ 参考: [ロジック](http://blog.livedoor.jp/crackstars/archives/992541.html)
57
+
58
+ ---
59
+
60
+ [追記2]
61
+
62
+ 念のため一応書いておきます。
63
+
64
+ **あくまで趣味の範囲でやっているので**正しくない部分があるかもしれませんが、まあ、私なりのとらえ方として。
65
+
66
+ std::vectorは内部ではJavaやC#でいうnew, C++でいうnew/delete, Cでいうmalloc/free を用いて確保しているっぽいです。
67
+
68
+ ```C++
69
+ // あくまでイメージ。
70
+ // 実際には template っていう機能?を使って実装しているようだけど、
71
+ // 例だし、面倒なので省略。ここではint型用としてやっています。
72
+ class IntVector{
73
+ public:
74
+ IntVector( int size = 100 ){
75
+ v = new int[size];
76
+ }
77
+ ~IntVector(){ delete v[]; }
78
+ // ほかにもメンバがあるとして
79
+ private:
80
+ int *v;
81
+ };
82
+ ```
83
+
84
+ で、削除したいとする。現在の要素数は10 だとして、4番目のデータを削除したい場合、
85
+
86
+ ```C++
87
+ // IntVector内だとして。
88
+ // また、iteratorを このIntVectorで使えるイテレータだとする
89
+ iterator remove( int pos ){
90
+ // 一旦、別容器を用意
91
+ // 現在のint *v の -1 (つまり要素数を一戸減らす)して生成
92
+ int s = size() - 1;
93
+ int *temp = new int[ s ];
94
+
95
+ // ここでv -> temp する。ただし、vのpos番目はスキップする
96
+
97
+ // ここでvをいったんdeleteするか上書きかわからんが、
98
+ // とにかくvを空だと想定する
99
+
100
+ // 再度vを容量確保する
101
+ v = new int[s];
102
+
103
+ // tempの内容物をvにコピー
104
+
105
+ return /* ここでIntVectorのiteratorを返す */;
106
+ }
107
+ ```
108
+
109
+ のようになっていると思う。
110
+
111
+ もちろん、この例はtemplateじゃなくてintに固定しているし、ところどころ違いますが、
112
+ 「別容器を用意してそれにいったん移し替えて、サイズ変更して...」的な処理をしていることは
113
+ 同じだと思う。
114
+
115
+ 現在のPCだと気にならない速度だと思いますが、なるべくしょーもない時間取りは省きたいですよね?
116
+
117
+ std::listならパーツを取り換えるだけで済むのでstd::vectorよりは早い。
118
+ ( これは D.A に載っている内容なので省きます。 )
119
+
120
+ ただし、リスト構造はエリア(厳密にはメモリアドレス)が飛び飛びなので
121
+ ランダムアクセスって呼ばれる、要素数を指定したアクセスとかが苦手です。
122
+
123
+ 配列やstd::vectorだと arr[1] とかみたいにアクセスできるけど、
124
+
125
+ リスト構造は イテレータって呼ばれる、走査するためのやつを使うか、拡張forと呼ばれるやつとかで
126
+ 最初から最後まで調べないといけない。( もちろん途中で抜けることはできるけど。 )
127
+
128
+ このメリット・デメリットを理解しているなら、
129
+
130
+ 「フーム、今回はできるだけランダムアクセスできるようにしたいなぁ。追加や削除は...いらねぇなぁ。ってーことは...今回はstd::vectorでいいんじゃね?」
131
+
132
+ みたいに考えることができる。

1

例の修正

2019/03/01 02:41

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -48,7 +48,8 @@
48
48
 
49
49
  多分、教科書・参考書しか読んでいない人に多いタイプかも。
50
50
 
51
- 算数・数学だと「教科書読みました。でも公式? 知りません。」っていうレベルです。
51
+ 算数・数学だと~~「教科書読みました。でも公式? 知りません。」っていうレベルです。~~
52
+ swordoneのお言葉をお借りして言うと、「教科書読みました。でもいつ公式を使うかわかりません。」っていうレベルです。
52
53
 
53
54
  実際に何か作品を作ってみてください。
54
55