在这里对模板类做非常非常简单的总结,以便于自己需要时有货可查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……
- 本文大部分知识来自 C++ Prime Plus,这里做的是总结归纳。 ↩