首页 > 编程语言 >C++ Vector数组优化

C++ Vector数组优化

时间:2023-08-20 16:47:18浏览次数:45  
标签:Vector int back C++ Entity vector 数组 Copied copy

Vector数组优化

问题

这是一段没有优化的代码:

#include<iostream>
#include<vector>

class Entity {
public:
	int x, y;
public:
	Entity(int x, int y) 
	:x(x),y(y){}

	Entity(const Entity& e) 
	:x(e.x),y(e.y){
		std::cout << "Copied!" << std::endl;
	}
};

int main(int argc, char* argv[]) {
	std::vector<Entity> e;
	e.push_back(Entity(1,2));
	e.push_back(Entity(3,4));
	e.push_back(Entity(5,6));
}

这段代码最终输出了六个Copied。

// 将在main函数中创建的Entity对象copy到vector中
Copied!
// vector内存不够用了,增长,把原来内存中的Entity对象copy到新的vector中,再把新的Entity对象copy到vector中,就有了两个copy
Copied!
Copied!
// vector内存不够用了,增长,把原来内存中的Entity对象copy到新的vector中,再把新的Entity对象copy到vector中,就有了三个copy
Copied!
Copied!
Copied!

可见,效率很低。下面是优化方法(两个方法一起用):

方法一

通过上面的分析可以得到,造成重复copy的原因是因为vector存不下了,要变长。如果一开始就指定vector的长度,就可以避免这个问题。

使用reserve方法来规定vector的长度:

#include<iostream>
#include<vector>

class Entity {
public:
	int x, y;
public:
	Entity(int x, int y) 
	:x(x),y(y){}

	Entity(const Entity& e) 
	:x(e.x),y(e.y){
		std::cout << "Copied!" << std::endl;
	}
};

int main(int argc, char* argv[]) {
	std::vector<Entity> e;
	e.reserve(10); // 规定可以放十个Entity
	e.push_back(Entity(1,2));
	e.push_back(Entity(3,4));
	e.push_back(Entity(5,6));
}

此时输出就只剩下三个Copied了。此时加上方法二,可以把这三个也优化掉:

方法二

剩下这三次复制,是因为要把main函数中创建的Entity对象copy到vector中。

可以使用emplace_back方法代替push_back方法,这样就不是在main函数中创建的Entity对象copy到vector中了。

#include<iostream>
#include<vector>

class Entity {
public:
	int x, y;
public:
	Entity(int x, int y) 
	:x(x),y(y){}

	Entity(const Entity& e) 
	:x(e.x),y(e.y){
		std::cout << "Copied!" << std::endl;
	}
};

int main(int argc, char* argv[]) {
	std::vector<Entity> e;
	e.reserve(10);
	e.emplace_back(1,2);
	e.emplace_back(3,4);
	e.emplace_back(5,6);
}

运行结果:什么都没有,省去了全部的复制。(当然,方法一有点牺牲空间换时间的意思,不过需要多少空间是大概可以估计的,可以把损失最小化)

标签:Vector,int,back,C++,Entity,vector,数组,Copied,copy
From: https://www.cnblogs.com/orzmiku/p/17644221.html

相关文章

  • C++ 智能指针
    智能指针使用智能指针需要引入memory头文件unique_ptr#include<iostream>#include<string>#include<memory>classEntity{public: Entity(){ std::cout<<"CreatedEntity!"<<std::endl; } ~Entity(){ std::cout<<&q......
  • C++ 链接库
    C++中使用库分为两种,静态库和动态库。简单来说,静态库最后会被编译进二进制文件,动态库不会,需要二进制文件从外部载入。以下操作均在VisualStudio2022中进行,以32位GLFW为例子(glfw.org)。首先下载glfw32位的可执行程序。在解决方案目录创建一个Dependencies文件夹(名字无所谓),然后......
  • C++ 创建库并使用
    创建库并使用!>使用VisualStudio2022创建项目和解决方案首先创建一个空项目,这里叫Game,同时VisualStudio会帮你创建解决方案。这个项目是我们的应用程序。创建项目来存库!>以静态库为例、右键解决方案,添加新项目Engine。此时就有了两个项目,Game和Engine:打开E......
  • C++ 类
    类类是一种把数据和功能结合在一起的方法。使用class来定义一个类,像这样:classPlayer{//创建一个Player类intx=0,y=0;intspeed=1;};通过类创建一个对象(实例化),像这样:Playerplayer;成员变量可以使用点(.)来访问对象的属性。player.speed=2;但......
  • C++ 类和结构体内外的Static
    类和结构体外的Static这里的static指的是在类外的static,意味着你要声明的是static的符号,链接将只在内部。(换句话说作用域只在他所在的.cpp文件)。下面是几组例子来理解:例子1:main.cpp#include<iostream>usingnamespacestd;voidfun(){cout<<"fun()inmain.cpp"......
  • C++ 继承
    继承一个类可以继承另一个类,避免了代码复写。被继承的类被叫做基类,继承的类叫做派生类。(或者说是父类和子类)继承类型当一个类派生自基类,该基类可以被继承为public、protected或private几种类型。继承类型是通过上面讲解的访问修饰符access-specifier来指定的。我们几乎......
  • C++ 构造函数与析构函数
    构造函数和析构函数构造函数构造函数会在实例化对象的时候执行,可以在实例化时传入参数。构造函数没有返回值。不需要声明返回值。构造函数的函数名与类名保持一致。//classname:PlayerPlayer(intxa=0,intya=0){//构造函数,传入初始坐标进行初始化......
  • C++ 变量初始化总结
    堆空间,new操作初始化1、对于有自己写构造函数的类,不论类型名后面有没有括号()或者数组[],都用构造函数进行初始化,如果构造函数delete,则编译报错;2、如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,3、而加了括号()的new会在分配内存的同时初始化为0。栈空间......
  • 1.8.21二维数组右上左下遍历
    1.题目描述给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。输入输入的第一行上有两个整数,依次为row和col。余下有row行,每行包含col个整数,构成一个二维整数数组。(注:输入的row和col保证0<row<100,0<col<100)输......
  • c++基础入门
    1.安装g++编译器是编译C++代码使用的编译器,不要使用gcc了。在用户目录中单独创建一个文件夹存放下载后的3个安装文件,然后进入到目录中执行下面命令cd文件夹sudodpkg-i*.deb本地安装sudoapt-getinstallg++在线安装2.C++的语言特点及优势cwithclass(类)cplusplus大型......