浅谈模板类vector和array

来源:互联网 发布:ubuntu内核 编辑:程序博客网 时间:2024/05/29 20:01

在这里对模板类做非常非常简单的总结,以便于自己需要时有货可查1.


  • 模板类vector
    ① 是一种动态数组,可在运行阶段设置vector对象的长度,也可以在末尾添加数据,在中间插入数据
    ② 使用new和delete来管理内存,但是是自动执行这两个操作的。
    ③ 必须 #include<vector> 和包含在名称空间std中
    ④ 简单使用:vector<typeName> vb(n_elem);
    上述声明创建一个名为vb的vector对象,它可储存n_elem个类型为typeName的元素。另,n_elem可以是常量或变量。
  • 模板类array
    ① 长度固定的静态数组,使用栈(静态内存分配),其效率与数组相同,但更方便和安全。
    ② 与数组不同的是,可以将一个array对象赋予给另一个array对象,数组就要逐元素复制数据
    ③ 必须 #include<array> 和包含在名称空间std中
    ④ 简单使用:array<typeName, n_elem> arr;
         与创建vector对象不同的是,n_elem不能是变量。

需要注意的是,vector和array对象并不会捕获非法索引,而编译器也不会检查这种超界错误。
如arr[-2]=20;
信息会存储到数组的外面
对此,可以选择成员函数at(),如:

arr.at(2)=2.3 //把2.3赋给arr[2]

在使用at()时,会在程序运行期间捕获非法索引,而程序默认将中断。这种额外检查的代价是运行时间更长。
另外还有一些类成员函数begin()end()能够确定边界,这日后再说……


  • 函数与array对象
      对于array类,调用函数时即可按值传递,亦可按地址传递或使用引用传递
    看看在函数声明或定义中关于array类的形式该怎么敲,
    例:
#include<iostream>#include<string>#include<array>const std::array<std::string, 4>Snames = {    "Spring","Summer","Fall","Winter"};     //定义一个全局array对象int main() {    //指出该函数接收的array对象的类型    void fill(std::array<std::duble_t, 4>*);    void show(std::array<std::double_t, 4>);    std::array<std::double_t, 4>expenses;    fill(&expenses);    std::cout << "EXPENSES\n";    show(expenses);    system("pause");    return 0;}void fill(std::array<std::double_t, 4>*pa) {    using namespace std;    for (int i = 0; i < 4; i++) {        cout << "Enter " << Snames[i] << " expenees:";        //关于array对象的指针的使用        cin >> (*pa)[i];    }}void show(std::array<std::double_t, 4>da) {    using namespace std;    for (int i = 0; i < 4; i++) {        cout << Snames[i] << ": $" << da[i] << endl;    }}//通过值(这里的show函数)传递,会造成比较大的内存开销,且效率低下//用指针直接处理原始对象,但代价是代码看起来更复杂//引用解决效率和表示法的问题

将在日后更新,讨论引用与array……


  1. 本文大部分知识来自 C++ Prime Plus,这里做的是总结归纳。 ↩
原创粉丝点击