IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> ?关于C++之模板类vector、array VS 数组 -> 正文阅读

[C++知识库]?关于C++之模板类vector、array VS 数组

模板类vectorarray是数组的替代品。

  1. vector
    模板类vector类似于string类,是一种动态数组
    基本上,它是使用new创建动态数组的替代品。
    实际上,vector类确实使用new和delete来管理内存,只是这种工作是自动完成的。

vector是序列容器,表示可以改变大小的数组。
与数组一样,vector使用连续的存储位置存储其元素,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,其效率与数组中的相同。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。

效率: vector类功能比较强大,但付出的代价是效率稍低。如果需要的是长度固定的数组,使用数组是更佳的选择,但代价是不那么方便和安全。

创建一个名为vt的vector对象,它可存储n_elem个类型为typeName的元素:
vector<typeName> vt(n_elem);

#include <iostream>
#include <vector>
int main() {
    std::vector<int> myvector;
    int myint;
    std::cout << "Please enter some integers (enter 0 to end):\n";
    do {
        std::cin >> myint;
        myvector.push_back(myint);
    } while (myint);
    std::cout << "myvector stores " << myvector.size() << " numbers.\n";
    return 0;
}
Please enter some integers (enter 0 to end):
|1 2 3<Enter>
|4 5<Enter>
|60<Enter>
|0<Enter>
myvector stores 7 numbers.
  1. array(C++11)
    效率: 鉴于vector的效率问题,C++11新增了模板类array。与数组一样,array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因此其效率与数组相同,但更方便,更安全。

array是固定大小的序列容器:它们包含按严格线性序列排序的特定数量的元素
在内部,array除了包含的元素外,不保留任何数据(甚至不保留其大小,这是一个模板参数,在编译时固定)。就存储大小而言,它与使用该语言的括号语法([])声明的普通数组一样高效。这个类只向其添加了一层成员和全局函数,因此数组可以用作标准容器。

创建一个名为arr的array对象,它包含n_elem个类型为typeName的元素:
array<typeName, n_elem> arr;

示例:

#include <iostream>
#include <vector>
#include <array>
int main() {
    using namespace std;
    double a1[4] = {1.2, 2.4, 3.6, 4.8};
    vector<double> a2(4);
    // no simple way to initialize in C98
    a2[0] = 1.0 / 3.0;
    a2[1] = 1.0 / 5.0;
    a2[2] = 1.0 / 7.0;
    a2[3] = 1.0 / 9.0;
    // C++11 create and initialize array object
    array<double, 4> a3 = {3.14, 2.72, 1.62, 1.41};
    array<double, 4> a4;
    a4 = a3;// valid for array objects of same size
    cout << "a1[2]:" << a1[2] << " at " << &a1[2] << endl;
    cout << "a2[2]:" << a2[2] << " at " << &a2[2] << endl;
    cout << "a3[2]:" << a3[2] << " at " << &a3[2] << endl;
    cout << "a4[2]:" << a4[2] << " at " << &a4[2] << endl;
    return 0;
}
a1[2]:3.6 at 0x128e9ffb70
a2[2]:0.142857 at 0x14f3eac1b90
a3[2]:1.62 at 0x128e9ffb30
a4[2]:1.62 at 0x128e9ffb10

首先,注意到无论是数组、vector对象还是array对象,都可使用标准数组表示法来访问各个元素。
其次,从地址可知,array对象和数组存储在相同的内存区域(即栈)中,而vector对象存储在另一个区域(自由存储区或堆)中。
第三,注意到可以将一个array对象赋给另一个array对象;而对于数组,必须逐元素复制数据。

不端行为:
如果示例代码中有:a1[-2] = 20.2;是被程序允许的,只是不同编译器作出的结果不一样,甚至做出更糟糕的结果,这表明数组的行为是不安全的。a2[-2] = .5; a3[200] = 1.4;也都是程序允许的。与C语言一样,C++也不检查这种超界错误。

然而,你还有其他选择,可以这样:a2.at(1) = 2.3;。中括号表示法和成员函数at()的差别在于,使用at()时,将在运行期间捕获非法索引,而程序默认将中断。这种额外检查的代价是运行时间更长,这就是C++允许你使用任何一种表示法的原因所在。
另外,这些类还让你能够降低意外超界错误的概率。例如,它们包含成员函数begin()和end(),让你能够确定边界,以免无意间超界。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:50:34  更:2022-03-03 15:56:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:47:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码