【C++STL】vector的使用,相关方法详解和注意点


示例:

class Shape
{
public:
	virtual void draw() = 0;
	virtual void erase() = 0;
	Shape() {}
	virtual ~Shape() {}
};
class Circle :public Shape
{
public:
	Circle() {}
	void draw() { cout << "Circle draw" << endl; }
	void erase() { cout << "Circle erase" << endl; }
	~Circle() {}
};
class Square :public Shape
{
public:
	Square() {}
	void draw() { cout << "Square draw" << endl; }
	void erase() { cout << "Square erase" << endl; }
	~Square() {}
};

必须使用Shape,因为只有基类的指针或引用才可以访问派生类的成员*

int main()
{              //必须使用Shape*,因为只有基类的指针或引用才可以访问派生类的成员
	std::vector<Shape*> shapevec;//vector的对象(未初始化)

请添加图片描述

string name;                   //first,last,end均指向空
	while (cin >> name, name != "end")
	{
		if (name == "Circle")
		{                  //将Circle的对象让(Shape*)类型指针所指。
			shapevec.push_back(new Circle());
		}
		if (name == "Square")
		{
			shapevec.push_back(new Square());
		}
		else
		{
			cout << "input shape name error" << endl;
		}
	for (auto& x : shapevec)//推演 x 是shape*&,x是shape*的引用
		{
			x->draw();
			x->erase();
		}
		for (auto x : shapevec)//推演 x 是shape*
		{
			x->draw();
			x->erase();
		}
	}
}
vector<int> iar;
iar.reserve(100)//只是进行简单的扩容

vector<int> iar;
iar.resize(100);//扩容完,还要对空间进行初始化

请添加图片描述
)

vector<Object*>objar;和vectorvec;的区别

  1. obj.push_back(Object(10));
  2. objar.push_back(new Object(10));
vector<Object*>objar;
vector<Object>vec;

obj.push_back(Object(10)); //是将Object的对象放入vector的容器空间,所以在释放vector的空间的时候,需要析构空间中的对象。

objar.push_back(new Object(10));//objar指向object对象的地址,因此释放空间只是将vector中的指针释放,并不能释放指针所指的对象。

请添加图片描述
3.emplace_back

 vector<Object*>objar;
  vector<Object>vec;
  objar.emplace_back(100); //vetor的空间是指针类型,指向100的地址
  vec.emplace_back(100);//直接使用定位new,在vector的当前空间构建对象,并将100作为参数,传进去。

使用唯一性智能指针:

  1. make_unique<>()
template<class T,class ...Arg>
std::unique<T> make_unique(Arg...arg)
{                       //forward
return unique_ptr<T>(new T(arg));
    
 }             //调用unique构造函数,创建不具名对象,指向circle对象的地址,返回这个unique_ptr的不具名对象.
                //将unique_ptr的对象存放在vector的空间中。(unique_ptr的对象中的指针指向了Circle对象的地址)
 shape.push_back(std::make_unique<Circle>());
             //等同于:std::unique_ptr<Shape>(new Circle());

                  

如下图:
请添加图片描述
5. shapevec.emplace_back(new Circle());

std::vector<std::unique_ptr<Shape> > shapevec;
shapevec.emplace_back(new Circle());

请添加图片描述
6. 如果使用 for (auto x : shapevec)是错误的,因为使用x,需要调用拷贝构造函数,将unique_ptr
拷贝给x,但是unique_ptr没有拷贝构造函数。

用到智能指针:可以自动化析构对象,和释放资源。
请添加图片描述

int main()
{
	std::vector<std::unique_ptr<Shape> > shapevec;//vector的对象(未初始化)    //first,last,end均指向空
	string name;
	while (cin >> name, name != "end")
	{
		if (name == "Circle")
		{
			//shapevec.push_back(std::make_unique<Circle>());
			shapevec.emplace_back(new Circle());//将Circle无名对象的地址拷贝给shapevec,
			                                 //shapevec中的Shape类型的指针指向Circle的地址。
		}
		else if (name == "Square")
		{
			//shapevec.push_back(std::make_unique<Square>());
			shapevec.push_back(std::unique_ptr<Shape>(new Circle));
		}
		else
		{
			cout << "input shape name error" << endl;
		}
	}
	     //如果使用 for (auto x : shapevec)是错误的,因为使用x,需要调用拷贝构造函数,将unique_ptr
	        //拷贝给x,但是unique_ptr没有拷贝构造函数。
		for (auto& x : shapevec)
		{
			x->draw();
			x->erase();
		}
	
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值