IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> vector里面的各种函数 -> 正文阅读

[C++知识库]vector里面的各种函数


可以简单的将vector想象成一个可扩容的线性表
在这里插入图片描述

vector的初始化

int main()
{
	int ar[] = { 12,23,34 };
	vector<int>ar1;
	vector<int>ar2 = {12,23,34,45,56};
	vector<int>ar3(10, 23);
	vector<int>ar4({ 12,23,34,45,56 });
	vector<int>ar5(ar1);
	vector<int>ar6(std::move(ar2));
	ar1 = { 12,23,34,45 };
	//ar1 = ar;erro
	ar1 = std::move(ar3);
	return 0;
}
int main()
{
	vector<Object> objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	return 0;
}

先构建4个对象,然后在vector里面拷贝构造
在这里插入图片描述

在这里插入图片描述

通过迭代器对vector里面的数据进行访问

#include<vector>
class Object
{
private:
	int value;
public:
	Object(int x = 0) :value(x) { cout << "Object" << endl; }
	Object(const Object& obj) :value(obj.value) { cout << "Object &" << endl; }
	Object(Object&& obj) :value(obj.value) { cout << "move Object&&" << endl; }
	Object& operator=(const Object& obj)
	{
		value = obj.value;
		cout << "operator=" << endl;
		return *this;
	}
	Object& operator=(const Object&& obj)
	{
		value = obj.value;
		cout << "operator=" << endl;
		return *this;
	}
	~Object()
	{
		cout << "~Object" << endl;
	}
	int& Value()
	{
		return value;
	}
};

int main()
{
	vector<Object> objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	for (int i = 0; i < objvec.size(); ++i)
	{
		cout << objvec[i].Value() << endl;
	}
	for (int i = 0; i < objvec.capacity(); ++i)
	{
		cout << objvec.at(i).Value() << endl;
	}
	vector<Object>::iterator it = objvec.begin();
	for (; it != objvec.end(); ++it)
	{//迭代器里面已经对->和*进行了运算符的重载
		cout << it->Value() << " " << (*it).Value() << endl;
	}
	it = objvec.begin();
	for (; it != objvec.end(); ++it)
	{
		cout << it->Value() << " " << endl;
		it->Value() += 100;
		cout << (*it).Value() << " "<< endl;
	}
	//如果不想让迭代器改变值用常性迭代器
	vector<Object>::const_iterator cit = objvec.begin();
	//const int *p;p++;
	for (; cit != objvec.end(); ++cit)
	{
		//cout << cit->Value()<< endl;erro长迭代器不能调用普通的方法
	    //两种解决办法1,将迭代器改为非常性;
	    //2,在类里面在设计一个常性方法
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	for (auto x : objvec)//推演出x是Object类型而不是iterator
	{
		cout << x.Value() << endl;
	}
	return  0;
}

在这里插入图片描述

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	//for (auto x : objvec)//推演出x是Object类型而不是iterator
	//{
	//	cout << x.Value() << endl;
	//}
	//不希望更改value就加const
	//没有好坏之分只有程序员的需求
	for (const auto &x : objvec)//推演出x是Object类型而不是iterator
	{
		cout << x.Value() << endl;
	}
	return  0;
}

在这里插入图片描述

//不建议这样写
int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	Object* op = objvec.data();
	cout << op->Value() << endl;
	op->Value() += 10;
	op->~Object();
	delete[]op;
}

reserve

#include<vector>
class Object
{
private:
	int value;
public:
	Object(int x = 0) :value(x) { cout << "Object" << endl; }
	Object(const Object& obj) :value(obj.value) { cout << "Object &" << endl; }
	Object(Object&& obj) :value(obj.value) { cout << "move Object&&" << endl; }
	Object& operator=(const Object& obj)
	{
		value = obj.value;
		cout << "operator=" << endl;
		return *this;
	}
	Object& operator=(const Object&& obj)
	{
		value = obj.value;
		cout << "operator=" << endl;
		return *this;
	}
	~Object()
	{
		cout << "~Object" << endl;
	}
	int& Value()
	{
		return value;
	}
};

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	objvec.reserve(10);
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
}

在这里插入图片描述
在这里插入图片描述

扩容导致迭代器失效

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	vector<Object>::iterator it = objvec.begin();
	Object& obj = objvec.back();
	objvec.reserve(10);
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
}

![

resize

在这里插入图片描述

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	/*vector<Object>::iterator it = objvec.begin();
	Object& obj = objvec.back();
	objvec.reserve(10);*/
	objvec.resize(10);
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
}

在这里插入图片描述
在这里插入图片描述

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	/*vector<Object>::iterator it = objvec.begin();
	Object& obj = objvec.back();
	objvec.reserve(10);*/
	objvec.resize(10);
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	objvec.resize(2);
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
}
int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
initializer_list<Object>arr = { Object(10),Object(20) };
	//c11
	int a{ 10 };
	int* p{ nullptr };
	int ar[]{ 12,23,34 };
	vector<int>veci{ 12,23,34 };
	list<int>ilist{ 12,23,34,45 };


	/*vector<Object>::iterator it = objvec.begin();
	Object& obj = objvec.back();
	objvec.reserve(10);*/
	objvec.resize(10);
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
}

列表方式初始化

#include<initializer_list>
template<class T>
class SeqList
{
	T* data;
	int maxsize;
	int cursize;
public:
	SeqList(int sz = 10) :data(T new[sz], maxsize(sz), cursize(sz)) {}
	SeqList(std::initializer_list<T>init)
	{
		maxsize = init.size();
		cursize = maxsize;
		data = (T*)malloc(sizeof(T) * maxsize);
	}
};

int main()
{
	SeqList<int>seqlist{ 12,23,34,45 };
	return 0;
}

assign

注意这几种扩容均可能导致迭代器失效

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	//objvec.reserve(10);//容量的扩张,不能收缩
	//objvec.resize(10);//size()=>不仅能扩容,还能增加对象的数量
	//objvec.resize(2);//size()=>不能收缩空间,但是能减少对象的个数
	for (auto& x : objvec)
	{
		cout << x.Value() << endl;
	}
	objvec.assign(10, Object(100));
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	for (auto& x : objvec)
	{
		cout << x.Value() << endl;
	}
}

在这里插入图片描述
在这里插入图片描述

reserve(1000)空间太大可用空间过多如何处理

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	objvec.reserve(100000);
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	{//tmp的生存期只在{}里面
		vector<Object>tmp(objvec);
		tmp.swap(objvec);
		//交换只交换first.last,end
	}
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
}

在这里插入图片描述

在这里插入图片描述

插入函数

push_back

push_back(100);是隐士构造,先创建无名对象object在对其拷贝构造,注意这里只有在单参构造函数里面才可以,如果你想拒绝隐士构建在但参构造函数前加explicit

int main()
{
		vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
		cout << objvec.size() << endl;
		cout << objvec.capacity() << endl;
		vector<Object>::iterator it = objvec.begin();
		cout << it->Value() << endl;
		objvec.push_back(Object(100));
		cout << it->Value() << endl;
}

插入函数可能会导致迭代器失效
在这里插入图片描述

insert函数

int main()
{
	vector<Object>objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	vector<Object>::iterator it = objvec.begin();
	objvec.insert(it,Object(20));//在头部插入(类似顺序表)效率很低
	//objvec.insert(it,{Object(100),Object(200)});
	return 0;
}

emplace_back()原位构建

int main()
{
	vector<Object>objvec;
	objvec.reserve(10);
	objvec = { Object(10),Object(20),Object(30),Object(40) };
	cout << objvec.size() << endl;
	cout << objvec.capacity() << endl;
	//objvec.push_back(Object(10));这样先构建无名对象,在给vector里面移动构造,在析构无名对象而原位构建直接构建
  //objvec.push_back(10);隐士构建
	objvec.emplace_back(100);
}

在这里插入图片描述

在这里插入图片描述

template<class T,class ...Arg>
void Make(T* p, Arg... arg)
{
	new(p) T(arg...);
	
}
int main()
{
	Object* p = (Object*)malloc(sizeof(Object));
	Object obj(12);
	Make(p, 12);
	Make(p, 12, 23);
	Make(p, std::move(obj));
}

在这里插入图片描述
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-31 23:45:54  更:2022-03-31 23:47:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:39:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码