9.9.9 通用类(3)
2. 通用集合类
集合类是以特定方式组织和存储对象的类,链表和堆栈都是典型的集合类示例。System::Collections::Generic命名空间包含许多实现了强类型集合的通用集合类。可用的通用集合类如表9-3所示。
表 9-3
|
类 型< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
说 明 |
|
List<T> |
将类型为T的项存入某个简单的
列表,该列表的大小可以
在需要时自动增长 |
|
LinkedList<T> |
将类型为T的项存入双链表 |
|
Stack<T> |
将类型为T的项存入堆栈,
堆栈是一种先入后出的存储机制 |
|
Queue<T> |
将类型为T的项存入队列,
队列是一种先入先出的存储机制 |
|
Dictionary<K,V> |
存储键/值对,其中键属于K类型,
值属于V类型 |
本书不打算深究所有这些类的细节,但会简要叙述一下在程序中最经常使用的3个。为简单起见,我们将使用存储数值类型的示例,但集合类与引用类型当然工作得一样好。
3. 通用列表List<T>
List<T>定义了一个通用的列表,该列表的大小可以在需要时自动增长。我们可以使用Add()函数给列表添加项,还可以使用索引访问List<T>中存储的项,就像在使用数组一样。下面是定义存储int类型数值的列表的方法:
- List<int> numbers = gcnew List<int>;
列表有默认的容量,但我们也可以指定所需的容量。下面这条语句定义的列表容量是500:
- List<int> numbers = gcnew List<int>;
我们可以使用Add()函数向列表中添加对象:
- for(int i = 0 ; i<1000 ; i++)
- numbers->Add( 2*i+1);
该循环向列表中添加1000个整数。该列表如果其容量小于1000,那么将自动增长。当我们需要向现有列表中存入数据时,可以使用Insert()函数。该函数将第二个实参指定的项,插入到第一个实参指定的索引位置。像数组一样,列表中的项是从0开始索引的。
我们可以像下面这样求出列表内容的总和:
- int sum = 0;
- for(int i = 0 ; i<numbers->Count ; i++)
- sum += numbers[i];
Count是一个返回列表项当前数量的属性。列表项可以通过默认的索引属性进行访问,我们以这种方式可以获得和设置数值。注意,我们不能使用默认的索引属性增加列表的容量。如果使用的索引超出了列表项的当前范围,则程序将抛出一个异常。
我们也可以用下面的方法求出列表项的总和:
- for each(int n in numbers)
- sum +=n;
可以处理列表的函数还有很多,其中包括删除元素、排序元素以及搜索列表内容等函数。
4. 通用双链表LinkedList<T>
LinkedList<T>函数定义了一个包含前向和后向指针的链表,因此我们可以在两个方向上迭代这种列表。我们可以像下面这样定义一个存储浮点数的链表:
- LinkedList<double>^ values = gcnew LinkedList<double>;
可以用下面的方法向链表中添加数值:
- for(int i = 0 ; i<1000 ; i++)
- values->AddLast(2.5*i);
AddLast()函数将某项添加到链表的最后。通过使用AddFirst()函数,我们可以将新项添加到链表的开始。作为另一种选择,我们可以使用AddHead()和AddTail()函数做相同的事情。
Find()函数将返回一个LinkedListNode<T>^类型的句柄,该句柄指向的链表节点包含我们给Find()传递的实参数值。该句柄可用来在找到的节点之前或之后插入新值。例如:
- LinkedListNode<double>^ node = values->Find(20.0);
- // Find node containing 20.0
- if(node != nullptr)
- values->AddBefore(node, 19.9); // Insert 19.1 before node
第一条语句寻找包含数值20.0的节点。如果这样的节点不存在,Find()函数就返回nullptr。当node非空时执行的最后一条语句在node之前存入新值19.9。我们可以使用AddAfter()函数在给定节点后面插入新值。搜索链表的速度相对较慢,因为需要顺序地迭代所有元素。
我们可以用下面的方法求出该链表中所有项的总和:
- double sumd = 0;
- for each(double v in values)
- sumd += v;