浅谈模板类vector和array

本文简要总结了C++中的模板类vector和array。vector是一种动态数组,允许在运行时设置长度和动态添加数据,而array是长度固定的静态数组,使用栈内存且操作更安全。两者都必须在std命名空间中使用。虽然它们不检查非法索引,但可以使用at()函数进行边界检查。文章还提及了array在函数传递中的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里对模板类做非常非常简单的总结,以便于自己需要时有货可查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,这里做的是总结归纳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值