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

學無先后,達者為師

網站首頁 編程語言 正文

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

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

一、vector

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

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

  • size():返回容納的元素個數
  • capacity():返回當前分配存儲的容量

(2)迭代器失效

在這里插入圖片描述

(3)區分const_iterator和const iterator

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

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

reserve():預留存儲空間,只改變capacity

增加 vector 的容量到大于或等于 new_cap 的值。若 new_cap 大于當前的 capacity() ,則分配新存儲,否則該方法不做任何事。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():改變容器中可存儲元素的個數size和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;
}

在這里插入圖片描述

(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));兩種方式構造對象的順序個數都相同!

在這里插入圖片描述

Object obj(10);

vcobj.push_back(obj);

在這里插入圖片描述

2. emplace()原位構造

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)關于原位構造(定位new + 完美轉發)

定位new:直接在指定的地址空間內調用構造函數

完美轉發:保留傳參的右值屬性

可變參數:根據傳參個數類型,調用不同的構造函數

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

在這里插入圖片描述

總結

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