C++动态数组std::vector的使用与优化
创作时间:
作者:
@小白创作中心
C++动态数组std::vector的使用与优化
引用
CSDN
1.
https://m.blog.csdn.net/lixiaorong222/article/details/145481778
在C++的标准模板库STL中,包含了很多容器的数据结构,其中vector(向量)是一种动态数组,其大小可以动态变化。本文将详细介绍vector的使用方法和优化技巧。
vector的基本使用
vector在内存中是连续存储的,可以使用push_back方法添加元素。下面是一个简单的示例:
#include <iostream>
#include <vector>
struct Vertex {
float x, y, z;
};
std::ostream& operator<<(std::ostream& stream, const Vertex v) {
stream << v.x << "," << v.y << "," << v.z;
return stream;
}
void print(const Vertex& v) {
std::cout << v << std::endl;
}
int main() {
std::vector<Vertex> vertexs;
vertexs.push_back({1, 2, 3});
vertexs.push_back({4, 5, 6});
for (int i = 0; i < vertexs.size(); ++i) {
std::cout << vertexs[i] << std::endl;
}
vertexs.erase(vertexs.begin() + 1);
std::cout << "after erase:" << std::endl;
for (Vertex& v : vertexs) {
std::cout << v << std::endl;
}
std::cout << "size:" << vertexs.size() << std::endl;
std::cout << "capacity:" << vertexs.capacity() << std::endl;
vertexs.clear();
std::cout << "after clear:" << std::endl;
for (Vertex& v : vertexs) {
print(v);
}
std::cout << "size:" << vertexs.size() << std::endl;
std::cout << "capacity:" << vertexs.capacity() << std::endl;
vertexs.shrink_to_fit();
std::cout << "after shrink_to_fit:" << std::endl;
std::cout << "size:" << vertexs.size() << std::endl;
std::cout << "capacity:" << vertexs.capacity() << std::endl;
std::cin.get();
}
输出结果表明:
- clear和erase只会改变数组大小,删除元素内容,但不会销毁内存capacity;
- shrink_to_fit会将内存调整到和数组大小一样大。
vector的内存管理机制
当vector容量不足时,需要将旧内存空间中的所有元素都拷贝进新内存空间中去,之后再在新内存空间中的原数据的后面继续进行插入构造新元素,并且同时释放旧内存空间。这也是vector动态扩容的机制。起始容量为0,不同编译器的扩容策略可能不同,例如GCC是2倍扩容,VS13是1.5倍扩容。
vector的优化技巧
使用emplace_back代替push_back
push_back总是会调用拷贝构造函数,而emplace_back支持直接传入构造函数需要的参数,不会调用拷贝构造函数,直接在数组中构造元素。下面是一个对比示例:
#include <iostream>
#include <vector>
class Vertex {
private:
int x, y, z;
public:
Vertex(int x, int y, int z) : x(x), y(y), z(z) {}
Vertex(const Vertex& v) : x(v.x), y(v.y), z(v.z) {
std::cout << "copy func()" << std::endl;
}
};
int main() {
std::vector<Vertex> vertexs;
vertexs.reserve(5);
std::cout << "capacity:" << vertexs.capacity() << " size:" << vertexs.size() << std::endl;
Vertex v(1, 2, 3);
std::cout << "push_back instance object:" << std::endl;
vertexs.push_back(v); // copy func()
std::cout << "emplace_back instance object:" << std::endl;
vertexs.emplace_back(v); // copy func()
std::cout << "push_back temp object:" << std::endl;
vertexs.push_back(Vertex(1, 2, 3)); // copy func()
std::cout << "emplace_back temp object:" << std::endl;
vertexs.emplace_back(Vertex(1, 2, 3)); // copy func()
std::cout << "emplace_back construct func:" << std::endl;
vertexs.emplace_back(1, 2, 3); // 不调用拷贝函数
return 0;
}
使用reserve预分配内存
reserve用于预分配内存,避免动态增长造成的开销。下面是一个使用reserve和resize的对比示例:
std::vector<Vertex> vertexs;
vertexs.reserve(10);
std::cout << "size:" << vertexs.size() << std::endl; // 0
std::cout << "capacity:" << vertexs.capacity() << std::endl; // 10
vertexs.reserve(0);
std::cout << "size:" << vertexs.size() << std::endl; // 0
std::cout << "capacity:" << vertexs.capacity() << std::endl; // 10
vertexs.push_back({1, 2, 3});
vertexs.push_back({4, 5, 6});
std::cout << "size:" << vertexs.size() << std::endl; // 2
std::cout << "capacity:" << vertexs.capacity() << std::endl; // 10
vertexs.resize(1);
std::cout << "size:" << vertexs.size() << std::endl; // 1
std::cout << "capacity:" << vertexs.capacity() << std::endl; // 10
vertexs.resize(20);
std::cout << "size:" << vertexs.size() << std::endl; // 20
std::cout << "capacity:" << vertexs.capacity() << std::endl; // 20
总结
为了优化vector的性能,可以采取以下措施:
- 使用reserve进行内存预分配;
- 使用emplace_back进行传参添加元素;
- 使用引用传递数组。
热门推荐
2026年浙江公务员考试公告职位表何时发布?
黄精的生长习性特点和生长环境条件
有关抚养费的法律规定是什么
“澳门社保”可在中山办!“粤澳社保一窗通”中山专窗正式启动
购车预算大揭秘:薪资才是硬道理,存款竟不是关键?
都说菠菜里有草酸,真的不能生吃吗?
株洲制造那些“新”事儿:从老工业基地到智能制造新高地
17-4PH钢板在热处理过程中析出时效硬化相
关于通信基站辐射,这些说法是对的!
AMD 锐龙9000系处理器散热需求测试:常规的设置+搭配足以应付日常使用
他们用空气变出了蛋白质和肉,试图靠二氧化碳养活地球
科普|面对“东方埃博拉”,你准备好了吗?
Excel表格中ROI计算方法详解
什么是财务分析ROI的核心指标?
围裙究竟属于哪一类物品?
侵占罪法律条款解析:了解相关法律规定,维护自身权益
辛亥革命:开启中国现代化转型之门
7种配色方案+配色法则,让设计更吸引力
如何正确准备和提交专利复审请求文件及费用?
中国商周时期青铜器冶炼技术源自西方?考古发现揭示真相
资源循环利用:高温垃圾焚烧炉的再利用研究
小行星撞击概率上升?如果落在中国怎么办?
如何区分住房贷款方式呢
首套房贷抵扣个税政策全解析:如何最大化你的税收优惠?
融资买入额和融资余额什么关系?
办公用房建筑面积法律解读及其实务影响
新生儿一分钟呼吸多少次正常
汽车产业,正在走向2024 CES展“深处”
风光媲美乌镇,这座免费小镇,绝对是退休旅行不可或缺的一站
企业文件管理软件如何优化文件存储结构?(优化存储结构,提升文件访问速度)