当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

利用::std::vector<>作为管理动态数组的优先挑选[VC/C++编程]

赞助商链接



  本文“利用::std::vector<>作为管理动态数组的优先挑选[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

择要: 本文介绍了C++尺度库中的容器类vector,解析了它的长处,并且倡议在利用程序中利用它作为动态数组的优先挑选,而不是MFC的CArray<>等其他类模板.最后介绍了vector的接口和利用时的注意事项.

在一些利用 MFC 的程序中,常常看到很多程序利用 CArray<>,由于 CArray<>的计划问题,造成利用它的代码的复杂化,增添了保护难度.因此倡议利用 ::std::vector<> 替换 CArray<>.

别的,也看到一些程序在用 malloc/realloc/free/new[]/delete[] 等手工管理内存.在利用程序中,手工管理内存是简单招致错误的,应当用 ::std::vector<> 之类的对象来管理动态数组.

由于 MSDN 中关于 ::std::vector 的内容较少,我们在这里做一些介绍,供参考.

不熟习 CArray<>/WIN32 也不要紧,这里提到它们的地方并不太多.

1. CArray<> VS ::std::vector<> ?

CArray<> 和 ::std::vector<> 一样,都是模板类,用于管理肆意范例的对象的动态数组.都在解构时释放所管理的动态内存.因此都可以用于替换手工动态数组管理.

但是,CArray<> 是在 C++ 尺度化之前很多年(VC++2.0时代)计划的,当时对 C++程序计划,面向对象程序计划,模板程序计划等技术熟习严重不足,特别是当时对面向对象技术的错误崇奉与宣扬,造成 CArray<> 的计划有庞大错误.

在 C++ 语言尺度化今后(1998),以及 VC++ 6.0 出世今后,供应了尺度的::std::vector<> 模板,基本上在任何方面都要优于 CArray<>.Microsoft 由于要支持老的程序,因此一向保存了 CArray<>,但明显并没有打算按照新的思惟去发展它(至少应当供应operator=(CArray const&)吧).

概括起来,CArray<> 与 ::std::vector<> 有以下差别:

1) CArray<> 是 MFC 中的,::std::vector<> 存在于任何尺度的 C++ 实现中.因此,你用熟了 CArray<> 也只能在 MFC 顶用,若用熟了 ::std::vector<>,你可以在任何平台的任何 C++ 编译器下利用.利用尺度的部件也有利于别人理解你的程序. . CArray<> 担当了 CObject,仅仅为了实现 serialization,这是不得当的, 违反了 "You don't pay for what you don't use." 的 C++ 计划原则.::std::vector<> 没有担当任何东西,只是实现了管理一个动态数组该做的事.

2) CArray<> 不是一个得当的值范例,比方下列操作都是不合理的:

CArray<int,int> a;
CArray<int,int> b(a); // error, must use Copy().
b = a;    // error, must use Copy().
b == a;    // error, you must write your own.
b < a;    // error, you must write your own.

与 CArray<> 相反,::std::vector<> 是一个认真计划的值范例,天生是可以拷贝构造和可赋值的.假如 T 是可对比的,那么 ::std::vector<T> 将自动地是可以对比的.

此外,由于触及到四个特别成员函数;

T(); // 缺省构造函数(default constructor)
~T(); // 解构函数(destructor)
T( T const& ); // 拷贝构造函数
T& operator=( T const& ); // 拷贝赋值函数

的自动生成,假如利用 CArray() 作为 T 的成员变量,那么上述的四个特别函数中的后两个将无法自动生成,需求手工写:

struct T
{
  T() {}
  T( T const& t )
  {
    a_.Copy( t.a_ );
    i_ = t.i_;
    d_ = t.d_;
    s_ = t.s_;
  }
  T& operator = ( T const& t )
  {
    if( this != &t )
    {
      a_.Copy( t.a_ );
      i_ = t.i_;
      d_ = t.d_;
      s_ = t.s_;
    }
    return *this;
  }
private:
  CArray<int,int> a_;
  int i_;
  double d_;
  ::std::string s_;
};

假如利用 ::std::vector<>:

struct T
{
private:
  ::std::vector<int> a_;
  int i_;
  double d_;
  ::std::string s_;
};

上面列出的三个特别成员函数都不需求写.好处是明显的:当你增减 T 的成员变量时,你没必要到T(T const&) 和 operator=() 中去呼应地增减.


  以上是“利用::std::vector<>作为管理动态数组的优先挑选[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Win7桌面利用本领介绍
  • 利用Javascript实现网页水印(非图片水印)
  • Win8利用商店收不到利用更新提醒的问题的办理办法
  • 快速清理Win7利用痕迹防护文档隐私问题
  • Win8若何安装利用程序 win8安装利用程序的办法
  • Win7系统中 虚拟Wifi 功效的利用办法与本领
  • 若何利用Win7移动中央一步完成电脑各种设置项
  • Win7利用库功效管理电脑文件利用图文详解
  • windows8 RP版利用中呈现死机问题的办理办法
  • DEDE 模板的相关知识以及利用本领
  • CSS3教程:利用@font-face实现本性化字体
  • 禁止windows xp和2003利用F8进入安全情势的办法
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .