<cliext/adapter>
(STL/CLR)
STL/CLR 标头 <cliext/adapter>
指定两个类模板(collection_adapter
和 range_adapter
)以及函数模板 make_collection
。
语法
#include <cliext/adapter>
要求
标头:<cliext/adapter>
命名空间:cliext
声明
类 | 说明 |
---|---|
collection_adapter |
将基类库 (BCL) 集合包装为范围。 |
range_adapter |
将范围包装为 BCL 集合。 |
函数 | 说明 |
---|---|
make_collection |
使用迭代器对创建范围适配器。 |
成员
collection_adapter
包装 .NET 集合以用作 STL/CLR 容器。 collection_adapter
是描述简单 STL/CLR 容器对象的模板类。 它包装基类库 (BCL) 接口,并返回用于操作受控序列的迭代器对。
语法
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>>;
参数
Coll
已包装集合的类型。
专用化
专业 | 说明 |
---|---|
IEnumerable |
对元素进行排序。 |
ICollection |
维护元素组。 |
IList |
维护有序的元素组。 |
IDictionary |
维护一组 {键, 值} 对。 |
IEnumerable<Value> |
对类型化元素进行排序。 |
ICollection<Value> |
维护类型化元素组。 |
IList<Value> |
维护有序的类型化元素组。 |
IDictionary<Value> |
维护一组类型化 {键, 值} 对。 |
成员
类型定义 | 说明 |
---|---|
collection_adapter::difference_type |
两个元素间的带符号距离的类型。 |
collection_adapter::iterator |
受控序列的迭代器的类型。 |
collection_adapter::key_type |
字典键的类型。 |
collection_adapter::mapped_type |
字典值的类型。 |
collection_adapter::reference |
元素的引用的类型。 |
collection_adapter::size_type |
两个元素间的带符号距离的类型。 |
collection_adapter::value_type |
元素的类型。 |
成员函数 | 说明 |
---|---|
collection_adapter::base |
指定包装的 BCL 接口。 |
collection_adapter::begin |
指定受控序列的开头。 |
collection_adapter::collection_adapter |
构造适配器对象。 |
collection_adapter::end |
指定受控序列的末尾。 |
collection_adapter::size |
对元素数进行计数。 |
collection_adapter::swap |
交换两个容器的内容。 |
运算符 | 说明 |
---|---|
collection_adapter::operator= |
替换存储的 BCL 句柄。 |
备注
可使用此模板类将 BCL 容器作为 STL/CLR 容器进行操作。 collection_adapter
存储 BCL 接口的句柄,该接口又控制一系列元素。 collection_adapter
对象 X
按顺序返回一对用于访问元素的输入迭代器 X.begin()
和 X.end()
。 某些专用化还允许编写 X.size()
以确定受控序列的长度。
collection_adapter::base
指定包装的 BCL 接口。
语法
Coll^ base();
备注
该成员函数返回存储的 BCL 接口句柄。
示例
// 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
指定受控序列的开头。
语法
iterator begin();
备注
该成员函数返回一个输入迭代器,指定受控序列的第一个元素,或刚超出空序列末尾的位置。
示例
// 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
构造适配器对象。
语法
collection_adapter();
collection_adapter(collection_adapter<Coll>% right);
collection_adapter(collection_adapter<Coll>^ right);
collection_adapter(Coll^ collection);
参数
collection
要包装的 BCL 句柄。
right
要复制的对象。
注解
构造函数:
collection_adapter();
使用 nullptr
初始化存储的句柄。
构造函数:
collection_adapter(collection_adapter<Coll>% right);
使用 right.base()
初始化存储的句柄。
构造函数:
collection_adapter(collection_adapter<Coll>^ right);
使用 right->base()
初始化存储的句柄。
构造函数:
collection_adapter(Coll^ collection);
使用 collection
初始化存储的句柄。
示例
// 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
两个元素间的带符号距离的类型。
语法
typedef int difference_type;
备注
该类型描述有符号元素计数。
示例
// 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
指定受控序列的末尾。
语法
iterator end();
备注
该成员函数返回一个输入迭代器,指向刚超出受控序列末尾的位置。
示例
// 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
受控序列的迭代器的类型。
语法
typedef T1 iterator;
备注
该类型描述未指定类型 T1
的对象,该对象可充当受控序列的输入迭代器。
示例
// 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
字典键的类型。
语法
typedef Key key_type;
备注
该类型是模板参数 Key
的同义词,用于 IDictionary
或 IDictionary<Value>
的专门化;否则未定义。
示例
// 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
字典值的类型。
语法
typedef Value mapped_type;
备注
该类型是模板参数 Value
的同义词,用于 IDictionary
或 IDictionary<Value>
的专门化;否则未定义。
示例
// 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=
替换存储的 BCL 句柄。
语法
collection_adapter<Coll>% operator=(collection_adapter<Coll>% right);
参数
right
要复制的适配器。
备注
成员运算符将 right
复制到对象,然后返回 *this
。 可使用它在 right
中将存储的 BCL 句柄替换为存储的 BCL 句柄的副本。
示例
// 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
元素的引用的类型。
语法
typedef value_type% reference;
备注
该类型描述了对元素的引用。
示例
// 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
对元素数进行计数。
语法
size_type size();
备注
成员函数将返回受控序列的长度。 它不是在 IEnumerable
或 IEnumerable<Value>
的专门化中定义的。
示例
// 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
两个元素间的带符号距离的类型。
语法
typedef int size_type;
备注
该类型描述非负元素计数。
示例
// 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
交换两个容器的内容。
语法
void swap(collection_adapter<Coll>% right);
参数
right
要与其交换内容的容器。
注解
该成员函数在 *this
和 right
之间交换存储的 BCL 句柄。
示例
// 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
元素的类型。
语法
typedef Value value_type;
备注
该类型是模板参数 Value
的同义词(如果存在于专门化中);否则它是 System::Object^
的同义词。
示例
// 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)
从迭代器对生成一个 range_adapter
。
语法
template<typename Iter>
range_adapter<Iter> make_collection(Iter first, Iter last);
参数
Iter
已包装迭代器的类型。
first
要包装的第一个迭代器。
last
要包装的第二个迭代器。
注解
函数模板返回 gcnew range_adapter<Iter>(first, last)
。 可使用它从一对迭代器构造一个 range_adapter<Iter>
对象。
示例
// 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)
一个模板类,可包装一对迭代器,用于实现多个基类库 (BCL) 接口。 可使用 range_adapter 来操作 STL/CLR 范围,如同操作 BCL 集合。
语法
template<typename Iter>
ref class range_adapter
: public
System::Collections::IEnumerable,
System::Collections::ICollection,
System::Collections::Generic::IEnumerable<Value>,
System::Collections::Generic::ICollection<Value>
{ ..... };
参数
Iter
与包装的迭代器关联的类型。
成员
成员函数 | 说明 |
---|---|
range_adapter::range_adapter |
构造适配器对象。 |
操作员 | 说明 |
---|---|
range_adapter::operator= |
替换存储的迭代器对。 |
接口
接口 | 说明 |
---|---|
IEnumerable | 循环访问集合中的元素。 |
ICollection | 维护元素组。 |
IEnumerable<T> | 循环访问集合中的类型化元素。 |
ICollection<T> | 维护类型化元素组。 |
备注
range_adapter 存储了一对迭代器,后者又界定了一个元素序列。 该对象实现四个 BCL 接口,使你可以按顺序循环访问元素。 可使用此模板类操作 STL/CLR 范围,如同操作 BCL 容器。
range_adapter::operator=
替换存储的迭代器对。
语法
range_adapter<Iter>% operator=(range_adapter<Iter>% right);
参数
right
要复制的适配器。
备注
成员运算符将 right
复制到对象,然后返回 *this
。 可使用它在 right
中将存储迭代器对替换为存储迭代器对的副本。
示例
// 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
构造适配器对象。
语法
range_adapter();
range_adapter(range_adapter<Iter>% right);
range_adapter(range_adapter<Iter>^ right);
range_adapter(Iter first, Iter last);
参数
first
要包装的第一个迭代器。
last
要包装的第二个迭代器。
right
要复制的对象。
注解
构造函数:
range_adapter();
使用默认构造的迭代器初始化存储的迭代器对。
构造函数:
range_adapter(range_adapter<Iter>% right);
通过复制存储在 right
中的对来初始化存储的迭代器对。
构造函数:
range_adapter(range_adapter<Iter>^ right);
通过复制存储在 *right
中的对来初始化存储的迭代器对。
构造函数:
range_adapter(Iter^ first, last);
使用 first
和 last
初始化存储的迭代器对。
示例
// 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