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<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()が使えるようになります。
#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アルゴリズムを適用することができます。
#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
