本文介绍: 是静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间可以,一切琐碎得由自己来,首先配置一块新的空间然后将旧空间数据搬往新空间,再释放原来的空间。Vector 维护一个线性空间,所以不论元素的型别如何,普通指针可以作为 vector迭代器,因为。的运用对于内存合理利 用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个 大块头的 array。的容量永 远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个 vector 容器就得另觅居所。

vector 容器

vector 容器基本概念

        vector数据安排以及操作方式,与
array
非常相似,两者的唯一差别在于空间的 运用的灵活性。Array
静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的 数据搬往新空间,再释放原来的空间。Vector
动态空间,随着元素的加入,它 的内部机制自动扩充空间以容纳新元素。因此 vector
的运用对于内存合理利 用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个 大块头的 array
了。
        Vector 的实现技术,关键在于其对大小控制以及重新配置时的数据移动效率, 一旦 vector
旧空间满了,如果客户新增一个元素,
vector
内部只是扩充一个元 素的空间,实为不智,因为所谓的扩充空间(
不论多大
)
,一如刚所说,是

配置新 空间-
数据移动

释放旧空间

的大工程
,
时间成本很高,应该加入某种未雨绸缪的考 虑,稍后我们便可以看到 vector
的空间配置策略

 vector 迭代

        Vector 维护一个线性空间,所以不论元素的型别如何,普通指针可以作为 vector 的迭代器,因为
vector
迭代器所需要的操作行为,如
operaroe
, operator->,
operator++, operator–, operator+, operator-, operator+=, operator-=,
普通指针天生
具备。
Vector
支持随机存取,而普通指针正有着这样的能力。所以
vector
提供的
随机访问迭代
(Random Access Iterators).
根据上述描述,如果我们写如下代码
Vector::iterator it1;
Vector::iterator it2;
it1
的型别其实就是
Int
,it2
的型别其实就是
Teacher*.
#define _CRT_SECURE_NO_WARNINGS
#include
<vector&gt;
int
main(){
        vector<
int
&gt; v;
        for
(
int
i =
0
; i <
10
;i ++){
                v.push_back(i);
                cout << v.capacity() << endl;
// v.capacity()
容器的容量
        }
        system(
pause
);
        return
EXIT_SUCCESS;
}

vector 数据结构

        Vector 所采用数据结构非常简单,线性连续空间,它以两个迭代器 MyfirstMylast 分别指向配置得来的连续空间中目前已被使用范围,并以迭代器
_Myend 指向整块连续内存空间的尾端。
        为了降低空间配置时的速度成本,vector
实际配置的大小可能比客户端需求大一 些,以备将来可能的扩充,这边是容量的概念。换句话说,一个 vector
的容量永 远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个 vector 容器就得另觅居所。
注意:
        所谓动态增加大小,并不是在原空间之后续接新空间(
因为无法保证原空间之后尚
有可配置的空间
)
,而是一块更大的内存空间然后将原数据拷贝新空间,并释放
原空间。因此,对 vector
的任何操作,一旦引起空间的重新配置,指向
vector 的所有迭代器就都失效了。这是程序员容易犯的一个错误,务必小心。

 vector 常用 API 操作

vector 构造函数

vector(v.begin(), v.end());
//

v[begin(), end())
区间中的元素拷贝给本身。
vector(n, elem);
//
构造函数
n

elem
拷贝给本身。
vector(
const
vector &amp;vec);
//
拷贝构造函数
int
arr[] = {
2
,
3
,
4
,
1
,
9
};
vector<
int
&gt; v1(arr, arr +
sizeof
(arr) /
sizeof
(
int
));

 vector 常用赋值操作

assign(beg, end);
//

[beg, end)
区间中的数据拷贝赋值给本身。
assign(n, elem);
//

n

elem
拷贝赋值给本身。
vector&amp;
operator
=(
const
vector &amp;vec);
//
重载等号操作符
swap(vec);
//

vec
与本身的元素互换。

 vector 大小操作

size();
//
返回器中元素的个数
resize(
int
num);
//
重新指定容器的长度
num
,若容器变长,则以默认值填充位置
如果容器变短,则末尾超出容器长度的元素被删除
resize(
int
num, elem);
//
重新指定容器的长度为
num
,若容器变长,则以
elem
值填
充新位置。如果容器变短,则末尾超出容器长
&gt;
度的元素被删除
capacity();
//
容器的容量
reserve(
int
len);
//
容器预留
len
个元素长度,预留位置初始化,元素不可访问

 vector 数据存取操作

at(
int
idx);
//
返回索引
idx
所指的数据,如果
idx
越界,抛出
out_of_range
异常
operator
[];
//
返回索引
idx
所指的数据,越界时,运行直接报错
front();
//
返回容器中第一个数据元素
back();
//
返回容器中最后一个数据元素

 vector 插入删除操作

insert(const_iterator pos,
int
count,ele);
//
迭代器指向位置
pos
插入
count
个元素
ele.
push_back(ele);
//
尾部插入元素
ele
pop_back();
//
删除最后一个元素
erase(const_iterator start, const_iterator end);
//
删除迭代器从
start

en
d
之间的元素
erase(const_iterator pos);
//
删除迭代器指向的元素
clear();
//
删除器中所有元素

 vector 案例

 巧用 swap 收缩内存空间
#define _CRT_SECURE_NO_WARNINGS
#include
<vector>
int
main(){
        vector<
int
> v;
        for
(
int
i =
0
; i <
100000
;i ++){
                v.push_back(i);
        }
        cout <<
capacity:”
<< v.capacity() << endl;
        cout <<
size:”
<< v.size() << endl;
        //此时 通过
resize
改变容器大小
        v.resize(
10
);
        cout <<
capacity:”
<< v.capacity() << endl;
        cout <<
“size:”
<< v.size() << endl;
        //容量没有改变
        vector<
int
>(v).swap(v);
        cout <<
capacity:”
<< v.capacity() << endl;
        cout <<
“size:”
<< v.size() << endl;
        system(
“pause
);
        return
EXIT_SUCCESS;
}

 reserve 预留空间

#define _CRT_SECURE_NO_WARNINGS
#include
<vector>
int
main(){
        vector<
int
> v;
        //预先开辟空间
        v.reserve(
100000
);
        int
* pStart = NULL;
        int
count =
0
;
        for
(
int
i =
0
; i <
100000
;i ++){
                v.push_back(i);
                if
(pStart != &amp;v[
0
]){
                        pStart = &amp;v[
0
];
                        count++;
                }
        }
        cout <<
count:”
<< count << endl;
        system(
“pause
);
        return
EXIT_SUCCESS;
}

原文地址:https://blog.csdn.net/weixin_50963877/article/details/134744051

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_26058.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注