设为首页 加入收藏

TOP

9.9.9 通用类(3)
2013-10-07 12:44:36 来源: 作者: 【 】 浏览:55
Tags:9.9.9 通用

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类型数值的列表的方法:

  1. List<int> numbers = gcnew List<int>

列表有默认的容量,但我们也可以指定所需的容量。下面这条语句定义的列表容量是500:

  1. List<int> numbers = gcnew List<int>

我们可以使用Add()函数向列表中添加对象:

  1. for(int i = 0 ; i<1000 ; i++)  
  2. numbers->Add( 2*i+1); 

该循环向列表中添加1000个整数。该列表如果其容量小于1000,那么将自动增长。当我们需要向现有列表中存入数据时,可以使用Insert()函数。该函数将第二个实参指定的项,插入到第一个实参指定的索引位置。像数组一样,列表中的项是从0开始索引的。

我们可以像下面这样求出列表内容的总和:

  1. int sum = 0;  
  2. for(int i = 0 ; i<numbers->Count ; i++)  
  3. sum += numbers[i]; 

Count是一个返回列表项当前数量的属性。列表项可以通过默认的索引属性进行访问,我们以这种方式可以获得和设置数值。注意,我们不能使用默认的索引属性增加列表的容量。如果使用的索引超出了列表项的当前范围,则程序将抛出一个异常。

我们也可以用下面的方法求出列表项的总和:

  1. for each(int n in numbers)  
  2. sum +=n; 


可以处理列表的函数还有很多,其中包括删除元素、排序元素以及搜索列表内容等函数。

4. 通用双链表LinkedList<T>

LinkedList<T>函数定义了一个包含前向和后向指针的链表,因此我们可以在两个方向上迭代这种列表。我们可以像下面这样定义一个存储浮点数的链表:

  1. LinkedList<double>values = gcnew LinkedList<double>

可以用下面的方法向链表中添加数值:

  1. for(int i = 0 ; i<1000 ; i++)  
  2. values->AddLast(2.5*i); 

AddLast()函数将某项添加到链表的最后。通过使用AddFirst()函数,我们可以将新项添加到链表的开始。作为另一种选择,我们可以使用AddHead()和AddTail()函数做相同的事情。

Find()函数将返回一个LinkedListNode<T>^类型的句柄,该句柄指向的链表节点包含我们给Find()传递的实参数值。该句柄可用来在找到的节点之前或之后插入新值。例如:

  1. LinkedListNode<double>node = values->Find(20.0);  
  2.      // Find node containing 20.0  
  3. if(node != nullptr)  
  4. values->AddBefore(node, 19.9); // Insert 19.1 before node 

第一条语句寻找包含数值20.0的节点。如果这样的节点不存在,Find()函数就返回nullptr。当node非空时执行的最后一条语句在node之前存入新值19.9。我们可以使用AddAfter()函数在给定节点后面插入新值。搜索链表的速度相对较慢,因为需要顺序地迭代所有元素。

我们可以用下面的方法求出该链表中所有项的总和:

  1. double sumd = 0;  
  2. for each(double v in values)  
  3. sumd += v; 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.9.9 通用类(4) 下一篇9.9.9 通用类(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: