<cliext/adapter> (STL/CLR)

L'intestazione <cliext/adapter> STL/CLR specifica due modelli di classe (collection_adapter e range_adapter) e il modello di make_collectionfunzione .

Sintassi

#include <cliext/adapter>

Requisiti

Intestazione:<cliext/adapter>

Spazio dei nomicliext:

Dichiarazioni

Classe Descrizione
collection_adapter Esegue il wrapping dell'insieme BCL (Base Class Library) come intervallo.
range_adapter Esegue il wrapping dell'intervallo come raccolta BCL.
Funzione Descrizione
make_collection Crea un adattatore di intervallo usando una coppia di iteratori.

Membri

collection_adapter

Esegue il wrapping di una raccolta .NET da usare come contenitore STL/CLR. È collection_adapter una classe modello che descrive un semplice oggetto contenitore STL/CLR. Esegue il wrapping di un'interfaccia BCL (Base Class Library) e restituisce una coppia di iteratori usata per modificare la sequenza controllata.

Sintassi

template<typename Coll>
    ref class collection_adapter;

template<>
    ref class collection_adapter<
        System::Collections::ICollection>;
template<>
    ref class collection_adapter<
        System::Collections::IEnumerable>;
template<>
    ref class collection_adapter<
        System::Collections::IList>;
template<>
    ref class collection_adapter<
        System::Collections::IDictionary>;
template<typename Value>
    ref class collection_adapter<
        System::Collections::Generic::ICollection<Value>>;
template<typename Value>
    ref class collection_adapter<
        System::Collections::Generic::IEnumerable<Value>>;
template<typename Value>
    ref class collection_adapter<
        System::Collections::Generic::IList<Value>>;
template<typename Key,
    typename Value>
    ref class collection_adapter<
        System::Collections::Generic::IDictionary<Key, Value>>;

Parametri

Coll
Tipo dell'insieme di cui è stato eseguito il wrapping.

Specializzazioni

Specializzazione Descrizione
IEnumerable Sequenze tramite elementi.
ICollection Gestisce un gruppo di elementi.
IList Gestisce un gruppo ordinato di elementi.
IDictionary Mantenere un set di coppie {key, value}.
IEnumerable<Value> Sequenze tramite elementi tipizzato.
ICollection<Value> Gestisce un gruppo di elementi tipizzato.
IList<Value> Gestisce un gruppo ordinato di elementi tipizzato.
IDictionary<Value> Gestisce un set di coppie {key, value} tipate.

Membri

Definizione dei tipi Descrizione
collection_adapter::difference_type Tipo di una distanza Signed tra due elementi.
collection_adapter::iterator Tipo di un iteratore per la sequenza controllata.
collection_adapter::key_type Tipo di chiave del dizionario.
collection_adapter::mapped_type Tipo di un valore del dizionario.
collection_adapter::reference Tipo di un riferimento a un elemento.
collection_adapter::size_type Tipo di una distanza Signed tra due elementi.
collection_adapter::value_type Tipo di un elemento.
Funzione membro Descrizione
collection_adapter::base Definisce l'interfaccia BCL di cui è stato eseguito il wrapping.
collection_adapter::begin Indica l'inizio della sequenza controllata.
collection_adapter::collection_adapter Costruisce un oggetto adapter.
collection_adapter::end Designa la fine della sequenza controllata.
collection_adapter::size Conta il numero di elementi.
collection_adapter::swap Scambia il contenuto di due contenitori.
Operatore Descrizione
collection_adapter::operator= Sostituisce l'handle BCL archiviato.

Osservazioni:

Questa classe modello viene usata per modificare un contenitore BCL come contenitore STL/CLR. Archivia collection_adapter un handle a un'interfaccia BCL, che a sua volta controlla una sequenza di elementi. Un collection_adapter oggetto X restituisce una coppia di iteratori X.begin() di input e X.end() che si usa per visitare gli elementi, in ordine. Alcune specializzazioni consentono anche di scrivere X.size() per determinare la lunghezza della sequenza controllata.

collection_adapter::base

Definisce l'interfaccia BCL di cui è stato eseguito il wrapping.

Sintassi

Coll^ base();

Osservazioni:

La funzione membro restituisce l'handle di interfaccia BCL archiviato.

Esempio

// cliext_collection_adapter_base.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
    {
    cliext::deque<wchar_t> d6x(6, L'x');
    Mycoll c1(%d6x);

    // display initial contents "x x x x x x "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    System::Console::WriteLine("base() same = {0}", c1.base() == %c1);
    return (0);
    }
x x x x x x
base() same = True

collection_adapter::begin

Indica l'inizio della sequenza controllata.

Sintassi

iterator begin();

Osservazioni:

La funzione membro restituisce un iteratore di input che definisce il primo elemento della sequenza controllata o appena oltre la fine di una sequenza vuota.

Esempio

// cliext_collection_adapter_begin.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // inspect first two items
    Mycoll::iterator it = c1.begin();
    System::Console::WriteLine("*begin() = {0}", *it);
    System::Console::WriteLine("*++begin() = {0}", *++it);
    return (0);
}
a b c
*begin() = a
*++begin() = b

collection_adapter::collection_adapter

Costruisce un oggetto adapter.

Sintassi

collection_adapter();
collection_adapter(collection_adapter<Coll>% right);
collection_adapter(collection_adapter<Coll>^ right);
collection_adapter(Coll^ collection);

Parametri

collection
Handle BCL da eseguire per il wrapping.

right
Oggetto da copiare.

Osservazioni:

Costruttore:

collection_adapter();

inizializza l'handle archiviato con nullptr.

Costruttore:

collection_adapter(collection_adapter<Coll>% right);

inizializza l'handle archiviato con right.base().

Costruttore:

collection_adapter(collection_adapter<Coll>^ right);

inizializza l'handle archiviato con right->base().

Costruttore:

collection_adapter(Coll^ collection);

inizializza l'handle archiviato con collection.

Esempio

// cliext_collection_adapter_construct.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d6x(6, L'x');

    // construct an empty container
    Mycoll c1;
    System::Console::WriteLine("base() null = {0}", c1.base() == nullptr);

    // construct with a handle
    Mycoll c2(%d6x);
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct by copying another container
    Mycoll c3(c2);
    for each (wchar_t elem in c3)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct by copying a container handle
    Mycoll c4(%c3);
    for each (wchar_t elem in c4)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    return (0);
}
base() null = True
x x x x x x
x x x x x x
x x x x x x

collection_adapter::difference_type

Tipi di distanza con segno tra due elementi.

Sintassi

typedef int difference_type;

Osservazioni:

Il tipo descrive un conteggio degli elementi con segno.

Esempio

// cliext_collection_adapter_difference_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // compute positive difference
    Mycoll::difference_type diff = 0;
    Mycoll::iterator it = c1.begin();
    for (; it != c1.end(); ++it)
        ++diff;
    System::Console::WriteLine("end()-begin() = {0}", diff);
    return (0);
}
a b c
end()-begin() = 3

collection_adapter::end

Designa la fine della sequenza controllata.

Sintassi

iterator end();

Osservazioni:

La funzione membro restituisce un iteratore di input che punta appena oltre la fine della sequenza controllata.

Esempio

// cliext_collection_adapter_end.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    Mycoll::iterator it = c1.begin();
    for (; it != c1.end(); ++it)
        System::Console::Write("{0} ", *it);
    System::Console::WriteLine();
    return (0);
}
a b c

collection_adapter::iterator

Tipo di un iteratore per la sequenza controllata.

Sintassi

typedef T1 iterator;

Osservazioni:

Il tipo descrive un oggetto di tipo T1 non specificato che può fungere da iteratore di input per la sequenza controllata.

Esempio

// cliext_collection_adapter_iterator.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    Mycoll::iterator it = c1.begin();
    for (; it != c1.end(); ++it)
        System::Console::Write("{0} ", *it);
    System::Console::WriteLine();
    return (0);
}
a b c

collection_adapter::key_type

Tipo di chiave del dizionario.

Sintassi

typedef Key key_type;

Osservazioni:

Il tipo è un sinonimo del parametro Keydi modello , in una specializzazione per IDictionary o IDictionary<Value>; in caso contrario, non è definito.

Esempio

// cliext_collection_adapter_key_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/map>

typedef cliext::map<wchar_t, int> Mymap;
typedef cliext::collection_adapter<
    System::Collections::Generic::IDictionary<wchar_t, int>> Mycoll;
typedef System::Collections::Generic::KeyValuePair<wchar_t,int> Mypair;
int main()
{
    Mymap d1;
    d1.insert(Mymap::make_value(L'a', 1));
    d1.insert(Mymap::make_value(L'b', 2));
    d1.insert(Mymap::make_value(L'c', 3));
    Mycoll c1(%d1);

    // display contents "[a 1] [b 2] [c 3] "
    for each (Mypair elem in c1)
    {
        Mycoll::key_type key = elem.Key;
        Mycoll::mapped_type value = elem.Value;
        System::Console::Write("[{0} {1}] ", key, value);
    }
    System::Console::WriteLine();
    return (0);
}
[a 1] [b 2] [c 3]

collection_adapter::mapped_type

Tipo di un valore del dizionario.

Sintassi

typedef Value mapped_type;

Osservazioni:

Il tipo è un sinonimo del parametro Valuedi modello , in una specializzazione per IDictionary o IDictionary<Value>; in caso contrario, non è definito.

Esempio

// cliext_collection_adapter_mapped_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/map>

typedef cliext::map<wchar_t, int> Mymap;
typedef cliext::collection_adapter<
    System::Collections::Generic::IDictionary<wchar_t, int>> Mycoll;
typedef System::Collections::Generic::KeyValuePair<wchar_t,int> Mypair;
int main()
{
    Mymap d1;
    d1.insert(Mymap::make_value(L'a', 1));
    d1.insert(Mymap::make_value(L'b', 2));
    d1.insert(Mymap::make_value(L'c', 3));
    Mycoll c1(%d1);

    // display contents "[a 1] [b 2] [c 3] "
    for each (Mypair elem in c1)
    {
        Mycoll::key_type key = elem.Key;
        Mycoll::mapped_type value = elem.Value;
        System::Console::Write("[{0} {1}] ", key, value);
    }
    System::Console::WriteLine();
    return (0);
}
[a 1] [b 2] [c 3]

collection_adapter::operator=

Sostituisce l'handle BCL archiviato.

Sintassi

collection_adapter<Coll>% operator=(collection_adapter<Coll>% right);

Parametri

right
Adapter da copiare.

Osservazioni:

L'operatore membro copia right nell'oggetto , quindi restituisce *this. Viene usato per sostituire l'handle BCL archiviato con una copia dell'handle BCL archiviato in right.

Esempio

// cliext_collection_adapter_operator_as.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // assign to a new container
    Mycoll c2;
    c2 = c1;
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();
    return (0);
}
a b c
a b c

collection_adapter::reference

Tipo di un riferimento a un elemento.

Sintassi

typedef value_type% reference;

Osservazioni:

Il tipo descrive un riferimento a un elemento.

Esempio

// cliext_collection_adapter_reference.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
    {
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    Mycoll::iterator it = c1.begin();
    for (; it != c1.end(); ++it)
    {   // get a reference to an element
        Mycoll::reference ref = *it;
        System::Console::Write("{0} ", ref);
    }
    System::Console::WriteLine();
    return (0);
}
a b c

collection_adapter::size

Conta il numero di elementi.

Sintassi

size_type size();

Osservazioni:

La funzione membro restituisce la lunghezza della sequenza controllata. Non è definito in una specializzazione per IEnumerable o IEnumerable<Value>.

Esempio

// cliext_collection_adapter_size.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d6x(6, L'x');
    Mycoll c1(%d6x);

    // display initial contents "x x x x x x "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();
    System::Console::WriteLine("size() = {0}", c1.size());
    return (0);
}
x x x x x x
size() = 6

collection_adapter::size_type

Tipo di una distanza Signed tra due elementi.

Sintassi

typedef int size_type;

Osservazioni:

Il tipo descrive un numero di elementi non negativi.

Esempio

// cliext_collection_adapter_size_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d6x(6, L'x');
    Mycoll c1(%d6x);

    // display initial contents "x x x x x x"
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    Mycoll::size_type size = c1.size();
    System::Console::WriteLine("size() = {0}", size);
    return (0);
}
x x x x x x
size() = 6

collection_adapter::swap

Scambia il contenuto di due contenitori.

Sintassi

void swap(collection_adapter<Coll>% right);

Parametri

right
Contenitore con cui scambiare il contenuto.

Osservazioni:

La funzione membro scambia gli handle BCL archiviati tra *this e right.

Esempio

// cliext_collection_adapter_swap.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents " a b c"
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct another container with repetition of values
    cliext::deque<wchar_t> d2(5, L'x');
    Mycoll c2(%d2);
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // swap and redisplay
    c1.swap(c2);
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();
    return (0);
}
a b c
x x x x x
x x x x x
a b c

collection_adapter::value_type

Tipo di un elemento.

Sintassi

typedef Value value_type;

Osservazioni:

Il tipo è un sinonimo del parametro Valuedi modello , se presente nella specializzazione; in caso contrario, è un sinonimo di System::Object^.

Esempio

// cliext_collection_adapter_value_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display contents "a b c" using value_type
    for (Mycoll::iterator it = c1.begin();
        it != c1.end(); ++it)
    {   // store element in value_type object
        Mycoll::value_type val = *it;

        System::Console::Write("{0} ", val);
    }
    System::Console::WriteLine();
    return (0);
}
a b c

make_collection (STL/CLR)

Creare un oggetto range_adapter da una coppia di iteratori.

Sintassi

template<typename Iter>
    range_adapter<Iter> make_collection(Iter first, Iter last);

Parametri

Iter
Tipo degli iteratori di cui è stato eseguito il wrapping.

first
Primo iteratore a capo.

last
Secondo iteratore di cui eseguire il wrapping.

Osservazioni:

Il modello di funzione restituisce gcnew range_adapter<Iter>(first, last). Viene usato per costruire un range_adapter<Iter> oggetto da una coppia di iteratori.

Esempio

// cliext_make_collection.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::deque<wchar_t> Mycont;
typedef cliext::range_adapter<Mycont::iterator> Myrange;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');

    // display contents " a b c"
    for each (wchar_t elem in d1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    System::Collections::ICollection^ p1 =
        cliext::make_collection(d1.begin(), d1.end());
    System::Console::WriteLine("Count = {0}", p1->Count);
    System::Console::WriteLine("IsSynchronized = {0}",
        p1->IsSynchronized);
    System::Console::WriteLine("SyncRoot not nullptr = {0}",
        p1->SyncRoot != nullptr);

    // copy the sequence
    cli::array<System::Object^>^ a1 = gcnew cli::array<System::Object^>(5);

    a1[0] = L'|';
    p1->CopyTo(a1, 1);
    a1[4] = L'|';
    for each (wchar_t elem in a1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    return (0);
}
a b c
Count = 3
IsSynchronized = False
SyncRoot not nullptr = True
| a b c |

range_adapter (STL/CLR)

Classe modello che esegue il wrapping di una coppia di iteratori usati per implementare diverse interfacce BCL (Base Class Library). Usare il range_adapter per modificare un intervallo STL/CLR come se fosse una raccolta BCL.

Sintassi

template<typename Iter>
    ref class range_adapter
        :   public
        System::Collections::IEnumerable,
        System::Collections::ICollection,
        System::Collections::Generic::IEnumerable<Value>,
        System::Collections::Generic::ICollection<Value>
    { ..... };

Parametri

Iter
Tipo associato agli iteratori di cui è stato eseguito il wrapping.

Membri

Funzione membro Descrizione
range_adapter::range_adapter Costruisce un oggetto adapter.
Operatore Descrizione
range_adapter::operator= Sostituisce la coppia iteratore archiviata.

Interfacce

Interfaccia Descrizione
IEnumerable Scorre gli elementi nella raccolta.
ICollection Gestisce un gruppo di elementi.
IEnumerable<T> Scorre gli elementi tipizzato nella raccolta.
ICollection<T> Gestisce un gruppo di elementi tipizzato.

Osservazioni:

Il range_adapter archivia una coppia di iteratori, che a sua volta delimitano una sequenza di elementi. L'oggetto implementa quattro interfacce BCL che consentono di scorrere gli elementi in ordine. Questa classe modello viene usata per modificare gli intervalli STL/CLR in modo analogo ai contenitori BCL.

range_adapter::operator=

Sostituisce la coppia iteratore archiviata.

Sintassi

range_adapter<Iter>% operator=(range_adapter<Iter>% right);

Parametri

right
Adapter da copiare.

Osservazioni:

L'operatore membro copia right nell'oggetto , quindi restituisce *this. Viene usato per sostituire la coppia iteratore archiviata con una copia della coppia iteratore archiviata in right.

Esempio

// cliext_range_adapter_operator_as.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::deque<wchar_t> Mycont;
typedef cliext::range_adapter<Mycont::iterator> Myrange;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Myrange c1(d1.begin(), d1.end());

    // display contents " a b c"
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // assign to a new container
    Myrange c2;
    c2 = c1;
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();
    return (0);
}
a b c
a b c

range_adapter::range_adapter

Costruisce un oggetto adapter.

Sintassi

range_adapter();
range_adapter(range_adapter<Iter>% right);
range_adapter(range_adapter<Iter>^ right);
range_adapter(Iter first, Iter last);

Parametri

first
Primo iteratore a capo.

last
Secondo iteratore di cui eseguire il wrapping.

right
Oggetto da copiare.

Osservazioni:

Costruttore:

range_adapter();

inizializza la coppia di iteratori archiviati con iteratori costruiti predefiniti.

Costruttore:

range_adapter(range_adapter<Iter>% right);

inizializza la coppia iteratore archiviata copiando la coppia archiviata in right.

Costruttore:

range_adapter(range_adapter<Iter>^ right);

inizializza la coppia iteratore archiviata copiando la coppia archiviata in *right.

Costruttore:

range_adapter(Iter^ first, last);

inizializza la coppia di iteratori archiviati con first e last.

Esempio

// cliext_range_adapter_construct.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::deque<wchar_t> Mycont;
typedef cliext::range_adapter<Mycont::iterator> Myrange;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');

    // construct an empty adapter
    Myrange c1;

    // construct with an iterator pair
    Myrange c2(d1.begin(), d1.end());
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct by copying another adapter
    Myrange c3(c2);
    for each (wchar_t elem in c3)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct by copying an adapter handle
    Myrange c4(%c3);
    for each (wchar_t elem in c4)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    return (0);
}
a b c
a b c
a b c