SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

STL/CLRツアーガイド

STL/CLRの特徴と、BCLと連携するためのヘルパ関数/クラス


array<T>でalgorithmを使うには...

 STL/CLRが提供するのはコンテナだけではありません。STLと同様、豊富なアルゴリズムが用意されています。

コンテナから要素を探す
cliext::vector<String^> container;
cliext::vector<String^>::iterator iter
  = cliext::find(container.begin(), container.end(),
                 gcnew String(L"three"));

 STLの場合、配列に対してアルゴリズムを適用できるのですが、managed配列であるarray<T>に対してはアルゴリズムが使えません。

arrayに対してはアルゴリズムが使えない
array<int>^ ary = { 0, 1, 2, 3, 4 };
cliext::reverse(ary, ary+5);
/*
   error C2676: 二項演算子 '+' : 'cli::array<Type> ^' は、
   この演算子または定義済の演算子に適切な型への変換の定義を行いません。
 */

 STL/CLRヘッダ<cliext/iterator>にはarray<T>をSTL/CLRコンテナ化するArrayContainerが定義されており、ArrayContainerでくるむことでbegin()/end()/size()が使えるようになります。

ArrayContainerでarrayをコンテナ化する
#include <cliext/iterator>
#include <cliext/algorithm>

using namespace System;

int main() {
  array<int>^ ary = { 0, 1, 2, 3, 4 };
  // ArrayContainer で array をwrapし、begin,end,size を使う。
  cliext::ArrayContainer<int> ary_(ary);
  cliext::reverse(ary_.begin(), ary_.end());
  for each ( int item in ary ) {
    Console::WriteLine(item);
  }
  Console::WriteLine(L"要素数: {0}", ary_.size());
}
実行結果
4
3
2
1
0
要素数: 5

BCLコレクションでalgorithmを使うには...

 array<T>と同様List<T>LinkedList<T>などのBCLコレクションに対しても、そのままではSTL/CLRアルゴリズムが適用できません。STL/CLRアルゴリズムはその適用範囲を与えなくてはならないにもかかわらず、BCLコンテナにはbegin()end()に相当するメソッドを持ち合わせていませんからね。

 そこで、STL/CLRはヘッダ<cliext/adapter>にBCLコレクションをSTL/CLRコンテナ化するcollection_adapterが定義されています。BCLコレクションをcollection_adapterでくるむことでarray<T>の場合と同様にbegin()/end()/size()が使え、それによってSTL/CLRアルゴリズムを適用することができます。

collection_adapterでBCLコレクションをコンテナ化する
#include <cliext/adapter>
#include <cliext/algorithm>

using namespace System;
using namespace System::Collections::Generic;

int main() {
  List<int> lst = gcnew array<int> { 0, 1, 2, 3, 4 };
  // collection_adapter で List をwrapし、begin,end,size を使う。
  cliext::collection_adapter<IList<int>> lst_(%lst);
  cliext::reverse(lst_.begin(), lst_.end());
  for each ( int item in lst ) {
    Console::WriteLine(item);
  }
  Console::WriteLine(L"要素数: {0}", lst_.size());
}
実行結果
4
3
2
1
0
要素数: 5

次のページ
まとめ

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2664 2008/07/08 06:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー