2018年10月15日月曜日
[MQL4] CArrayObj と CList の違い
include/Arrays
以下にはオブジェクトを格納できる CArrayObj と CList が定義されています。
どちらも大体同じような機能を提供しているのですが、何が違うのか見てみました。
結論から言うと、CArrayObj
の方は内部で配列を持っているのに対し、CList
は CObject の持つリンクリスト機能を使っています。
CArrayObj
CArrayObj
は一般的な配列同様に使用できます。
ランダムアクセスする場合などはこちらを使うと良いでしょう。
参考
CList
CList
は内部にポジションを持っており、GetNextNode()
のようにイテレーティブな処理をする場合、高速に処理できます。
全要素に対して一気に処理をかけるような処理に向いています。
以下に簡単な例を挙げます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #property strict #include <Object.mqh> #include <Arrays/List.mqh> class Item : public CObject { private : const int m_value; public : Item( int value) : m_value(value) { } virtual ~Item() { } int GetValue() const { return m_value; } virtual int Compare( const CObject *node, const int mode=0) const { int diff = this .GetValue() - dynamic_cast < const item*= "" >(node).GetValue(); return (diff == 0) ? 0 : (diff > 0) ? 1 : -1; } }; CList m_item_list; void OnStart() { for ( int i = 0; i < 10; i++) { int value = (i % 2 == 0) ? i : i + 10; m_item_list.Add( new Item(value)); } // 内部ポインタを最初にもどす m_item_list.MoveToIndex(0); Item* item; // 「最後まで一気に処理する」みたいなのに向いている while ((item = m_item_list.GetNextNode()) != NULL ) { printf ( "%d" , item.GetValue()); } } |
なお、CList
も CArrayObj
と同様、Sort 済みでないと検索が出来ません。
また、Compare()
の実装によっては検索結果が想定外になることもあるので気をつけてください。
参考