日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C++?STL中vector容器的使用_C 語言

作者:code-016 ? 更新時(shí)間: 2022-05-14 編程語言

一、vector

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

(1)區(qū)分size()和capacity()

  • size():返回容納的元素個(gè)數(shù)
  • capacity():返回當(dāng)前分配存儲(chǔ)的容量

(2)迭代器失效

在這里插入圖片描述

(3)區(qū)分const_iterator和const iterator

  • const_iterator:常性迭代器,指向的對象的屬性為常性;
  • const iterator:常性的普通迭代器,迭代器自身屬性為常性;

(4)區(qū)分reserve()和resize()

reserve():預(yù)留存儲(chǔ)空間,只改變capacity

增加 vector 的容量到大于或等于 new_cap 的值。若 new_cap 大于當(dāng)前的 capacity() ,則分配新存儲(chǔ),否則該方法不做任何事。reserve() 不更改 vector 的 size 。

若 new_cap 大于 capacity() ,則所有迭代器,包含尾后迭代器和所有到元素的引用都被非法化。否則,沒有迭代器或引用被非法化。

#include 
#include 
using namespace std;
class Value
{
public:
	Value()
	{
		cout << "Value()"<< endl;
	}
	~Value()
	{
		cout << "~Value()" << endl;
	}
};
void Vector_user()
{
	vector vec;
	//vec.resize(10);
	vec.reserve(10);
	cout << vec.capacity()<< endl;
	cout << vec.size()<< endl;
}
int main()
{
	Vector_user();
	return 0;
}

在這里插入圖片描述

resize():改變?nèi)萜髦锌纱鎯?chǔ)元素的個(gè)數(shù)size和capacity,并調(diào)用默認(rèn)的構(gòu)造函數(shù)

#include 
#include 
using namespace std;
class Value
{
public:
	Value()
	{
		cout << "Value()"<< endl;
	}
	~Value()
	{
		cout << "~Value()" << endl;
	}
};
void Vector_user()
{
	vector vec;
	vec.resize(10);
	//vec.reserve(10);
	cout << vec.capacity()<< endl;
	cout << vec.size()<< endl;
}
int main()
{
	Vector_user();
	return 0;
}

在這里插入圖片描述

(5)push_back和emplace

1.push_back()

#include 
#include 
using namespace std;
class Object
{
private:
	int val;
public:
	Object(int x = 0):val(x)
	{
		cout << "Object(int x)"<< endl;
	}
	Object(const Object& src): val(src.val)
	{
		cout << "Object(const Object& src)" << endl;
	}
	Object(Object&& src) : val(src.val)
	{
		cout << "Object(Object&& src)" << endl;
	}
	Object& operator=(const Object& src)
	{
		val = src.val;
		cout << "=" << endl;
		return *this;
	}
	Object& operator=(Object&& src)
	{
		val = src.val;
		cout << "=&" << endl;
		return *this;
	}
	~Object()
	{
		cout << "~Object()" << endl;
	}
};
void fun()
{
	std::vector vcobj;
	vcobj.reserve(5);
	vcobj.push_back(10);
	//vcobj.push_back(Object(10));
}
int main()
{
	fun();
	return 0;
}

push_back(10);push_back(Object(10));兩種方式構(gòu)造對象的順序個(gè)數(shù)都相同!

在這里插入圖片描述

Object obj(10);

vcobj.push_back(obj);

在這里插入圖片描述

2. emplace()原位構(gòu)造

void fun()
{
	std::vector vcobj;
	vcobj.reserve(5);
	vcobj.emplace_back(10);
}

在這里插入圖片描述

void fun()
{
	std::vector vcobj;
	vcobj.reserve(5);
	vcobj.emplace_back(Object(10));
}

在這里插入圖片描述

void fun()
{
	std::vector vcobj;
	vcobj.reserve(5);
	Object obj(10);
	vcobj.emplace_back(obj);
}

在這里插入圖片描述

(6)關(guān)于原位構(gòu)造(定位new + 完美轉(zhuǎn)發(fā))

定位new:直接在指定的地址空間內(nèi)調(diào)用構(gòu)造函數(shù)

完美轉(zhuǎn)發(fā):保留傳參的右值屬性

可變參數(shù):根據(jù)傳參個(gè)數(shù)類型,調(diào)用不同的構(gòu)造函數(shù)

template
void Make(T* p, Arg... arg)
{
	new(p) T(std::forward(arg)...);
}
int main()
{
	//1.開辟空間
	Object* p = (Object*)malloc(sizeof(Object));
	//2.在p指向的地址空間調(diào)用構(gòu)造Object(10)
	Make(p, 10);
	//3.釋放空間并調(diào)用析構(gòu)函數(shù)
	delete p;
	return 0;
}

在這里插入圖片描述

總結(jié)

原文鏈接:https://blog.csdn.net/xiaoxiaoguailou/article/details/123377623