有关STL中的容器和MFC的集合类型构造函数区别的一点思考

转载 2011年01月16日 09:37:00

作者:朱金灿
来源:http://blog.csdn.net/clever101



晚上查了一下MSDN,对STL中的容器和MFC的集合类型构造函数区别有所领悟,特写下来和大家分享。不当之处,还望大家赐教!

以前使用MFC的集合类型,即CArray和CMap等类,再使用STL的vector、map等类,感觉最大的区别在于其构造函数。当时我感觉MFC的集合类型的构造函数怪怪的,比如CArray和CMap的构造函数是





view plaincopy to clipboardprint?
template < class TYPE, class ARG_TYPE = const TYPE& >
class CArray :
public CObject

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap : public CObject



而STL的vector和map的构造函数形式如下:




view plaincopy to clipboardprint?
template <
class Type,
class Allocator = allocator<Type>
>
class vector

template <
class Key,
class Type,
class Traits = less<Key>,
class Allocator=allocator<pair <const Key, Type> >
>
class map




(这里值得注意的是STL中的vector的构造函数的模板参数为2个,map为4个,但是vector的第二个、map中的第三个和第四个参数都是可选参数,我们在绝大多数情况下都使用其默认值)



当初我觉得MFC的集合类真是繁琐,特别是CMap,需要用户填充四个参数。试想一个动态数组类,用户只需提供一个数组元素类型就可以了,一个字典(即map),用户只需提供键值类型和元素类型就可以了,这是一个多么符合自然的设计!同时我认为一个程序库的类和函数接口的设计的一个重要原则应是接口的参数应尽量少和符合一般思路,因为这会大大降低用户使用库的难度。那时我很难理解MFC的集合类型的设计,我想微软的设计人员是不是脑子进水了?


今晚看MSDN,偶尔看到CArray类的第二个参数的解释:


ARG_TYPE
Template parameter specifying the argument type used to access objects stored in the array. Often a reference to TYPE. ARG_TYPE is a parameter that is passed to CArray.

让我翻译一下:ARG_TYPE模板参数是用来指定访问数组的参数类型,通常是TYPE(数组元素类型)的引用。ARG_TYPE是一个传递给CArray的参数。

我看到access这个单词(中文译为访问)突然有所领悟。实际上在这句话中access正是关键词。访问在一个动态数组中涉及到哪些方面呢?我想到两方面:一是速度;二是数据访问权限。所谓速度,是指访问数组元素,是直接构造一个元素类型的临时变量,还是使用其引用类型或指针什么的。C++中对于简单类型、及简单类型的引用或指针,其访问速度是一样的,但对于复杂类型,显然使用引用或指针访问速度更快(不太明白其中原理的同学请参考《深度探索C++模型》,这里不作详述)。数据访问权限我想到的一种的情况应该是为了防止用户不小心修改了数据而设定常量类型,就是通过设定访问类型来达到保护数据的目的。STL是如何应对这方面的问题的呢?用过STL的同学估计都知道STL通过使用迭代器来解决这方面的问题,如常量迭代器就是为了保护数据的。而MFC中没有迭代器类型,所以通过这种办法来解决。

最后我想说的是:即使我大致明白了MFC集合类型的设计思路,但我还是比较认同STL的设计,一则STL的设计比较自然,合符人的思路,二则通过增加迭代器类型使得类的职责更为分明(迭代器类就是主要承担容器的访问功能的)。

STL容器与拷贝构造函数

所有容器提供的都是“value语意”而非“reference语意”。容器内进行元素的安插操作时,内部实施的是拷贝操作,置于容器内。因此STL容器的每一个元素都必须能够拷贝。---> 侯捷、孟岩译 p1...

对c++拷贝构造函数的一点理解

1.首先说明什么是拷贝构造函数

C++ 中关于默认构造函数的一点困惑

一:默认构造函数(default constructor)的定义 就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量...

关于默认构造函数的一点琢磨--全局变量和局部变量

首先看一个例子: class A { public: //为了直接访问 int i; }; A a; int main(void) { cout ...

Java中访问修饰符和构造函数的一点总结

JAVA访问修饰符 public| private protected default

关于默认构造函数的一点总结

我们定义一个简单的类: class func { public: int a; int b; }; 1.假如我们不写构造函数,那么: func obj();//编译器会误认为是一个函数的声明 ...

右值引用与移动构造函数的一点理解

说明:右值引用是c++11中的新特性,本来c++中是有一个左值引用的,引入右值引用后,多了很多概念,再看prime的时候,就觉得似乎让c++更繁琐了。偶然在知乎上看到这个话题,于是有了一点理解,遂记录...
  • q__y__L
  • q__y__L
  • 2017年03月30日 20:23
  • 432

C++的一点基本自我修养(二)--拷贝构造函数

拷贝构造函数          在C++中,除了可以使用构造函数直接创建一个新的对象之外,有时还需要根据已经存在的某个对象创建一个新的对象作为这个对象的副本。          在大多数情况下,默...

C++默认构造函数的一点说明

大多数C++书籍都说在我们没有自己定义构造函数的时候,编译器会自动生成默认构造函数。其实这句话我一直也是深信不疑。但是最近看了一些资料让我有了一点新的认识。   其实我觉得大多数C++书籍...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关STL中的容器和MFC的集合类型构造函数区别的一点思考
举报原因:
原因补充:

(最多只允许输入30个字)