Lesson 06 vector类(上)

news/2024/7/29 19:30:33 标签: c++, 算法

C++:渴望力量吗,少年?

文章目录

  • 一、vector是什么?
  • 二、vector的使用
    • 1. 构造函数
    • 2. vector iterator
    • 3. vector 空间增长问题
    • 4. vector增删查改
  • 三、vector实际使用


一、vector是什么?

  vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
注意:使用vector需要包含头文件 < vector >

二、vector的使用

1. 构造函数

函数名称功能说明
vector()(重点)无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val
vector (const vector& x); (重点)拷贝构造
vector (InputIterator first, InputIterator last);使用迭代器进行初始化构造

2. vector iterator

iterator的使用接口说明
begin + end(重点)获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator /const_iterator
rbegin + rend获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

在这里插入图片描述

3. vector 空间增长问题

容量空间接口说明
size获取数据个数
capacity获取容量大小
empty判断是否为空
resize(重点)改变vector的size
reserve (重点)改变vector的capacity

4. vector增删查改

函数名称功能说明
push_back(重点)尾插
pop_back (重点)尾删
find查找并返回位置
insert在position之前插入val
erase删除position位置的数据
swap交换两个vector的数据空间
operator[ ] (重点)可以像数组一样访问

三、vector实际使用

代码如下:

#include<iostream>
#include<vector>

using namespace std;

void test_vector1()
{
	cout << "我是 test_vector1()" << endl;
	vector<int> v1;
	vector<int> v2(10, 0);//内容是10个0

	vector<int> v3(v2.begin(), v2.end());//可以用迭代器初始化
	string str("hello world");
	vector<int> v4(str.begin(), str.end());//也可以用其他容器的迭代器初始化
	vector<int> v5(v4);//拷贝构造

    //遍历
	for (size_t i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << " ";//运算符重载
	}
	cout << endl;

	//vector<int>::iterator it = v4.begin();
	auto it = v4.begin();//迭代器遍历
	while (it != v4.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : v5)//范围for遍历(本质上还是迭代器)
	{
		cout << e << " ";
	}
	cout << endl;

	cout << endl;
}

void test_vector2()
{
	cout << "我是 test_vector2()" << endl;

	size_t sz;
	vector<int> v;
	//v.reserve(55);//1可以提前将空间设置足够,就可以避免边插入边扩容导致效率低下的问题了
	sz = v.capacity();
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)//查看扩容的具体数据
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
    //vs下使用的STL基本是按照1.5倍方式扩容
	cout << endl;
}

void test_vector3()
{
	cout << "我是 test_vector3()" << endl;

	vector<int> v1;
	cout << v1.max_size() << endl;//没啥用

	vector<int> v;
	//v.reserve(100);  // size = 0    capacity 100
	v.resize(100);     // size = 100  capacity 100

	for (size_t i = 0; i < 100; i++)
	{
		v[i] = i;//如果是注释上面的v.resize(100),取消对v.reserve(100)的注释仍会报错
		//虽然空间是开出来了,但是因为这个运算符重载包含对下标的断言,超过size就报错
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	cout << endl;
}

void test_vector4()
{
	cout << "我是 test_vector4()" << endl;

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	v.insert(v.begin(), 0);//和string一样,效率不高,不建议经常使用

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	auto it = find(v.begin(), v.end(), 3);//在首尾之间找数字3并返回下标
	if (it != v.end())
	{
		v.insert(it, 30);//在3前面插入30
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	it = find(v.begin(), v.end(), 3);
	if (it != v.end())
	{
		v.erase(it);//删除元素
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	cout << "Before clear:" << endl;
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.clear();//清除内容,容量还在
	cout << "After clear:" << endl;
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.shrink_to_fit();//缩容至合适的容量,不怎么使用
	cout << "After shrink_to_fit:" << endl;
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	cout << endl;
}

int main()
{
	test_vector1();
	test_vector2();
	test_vector3();
	test_vector4();

	return 0;
}

vector的使用和string差不多,其余操作可以自行查阅或者参考之前的文章:
String类(上)
String类(中)



http://www.niftyadmin.cn/n/5297215.html

相关文章

P1019 [NOIP2000 提高组] 单词接龙 刷题笔记

P1019 [NOIP2000 提高组] 单词接龙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路来自 大佬 Chardo 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 匹配 &#xff1a; 将 第一个字符串末尾 和第二个字符串第一个开始匹配 如果 j<i这段走完了 flag还没…

【零基础入门VUE】在 Vue 中构建复杂表单

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门VUE专栏https://blog.csdn.net/arthas777/category_12537076.html 目录 v-modelVue 中的 指令 Vue 中的组件 没有构建步骤 随着构建步骤 注册 VUE 组件 Vue 道具 VUE 中的道具声明 在 VUE 中传递 PROP…

Java Iterable和Iterator接口区别是什么?

Java Iterable和Iterator接口区别是什么&#xff1f; Iterable 和 Iterator 是 Java 集合框架中的两个关键接口&#xff0c;用于支持遍历集合元素的操作。它们之间的区别如下&#xff1a; Iterable 接口&#xff1a;这是一个顶层接口&#xff0c;定义了一个返回迭代器的方法 i…

go-pg框架如何查询指定的列

目录 指定单列 指定多列 指定单列 通过id查询name列 var name string .Where("id ?", id).Column("name").Select(&name) 指定多列 通过class查询age、name type AgeAndName struct {Age intName string }var records []AgeAndName .Where(…

Linux:apache优化(4)—— 隐藏版本号

运行环境 yum -y install apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre gcc make zlib-devel 源码包配置 ./configure --prefix/usr/local/httpd --enable-cgi --enable-rewrite --enable-so --enabl…

JSoup 爬虫遇到的 404 错误解决方案

在网络爬虫开发中&#xff0c;使用JSoup进行数据抓取是一种常见的方式。然而&#xff0c;当我们尝试使用JSoup来爬虫抓取腾讯新闻网站时&#xff0c;可能会遇到404错误。这种情况可能是由于网站的反面爬虫机制检测到了我们的爬虫行为&#xff0c;从而拒绝了我们的请求。 假设我…

2. SQL - 约束

1 主键约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录。 主键必须包含唯一的值。 主键列不能包含 NULL 值。 每个表都应该有一个主键&#xff0c;并且每个表只能有一个主键。 添加主键约束 创建表时&#xff0c;在字段描述处&#xff0c;声明指定字段为主键创建表时&…

Java excel单元格内容读取为字符串格式

导出数据到Excel&#xff0c;并把单元格内容转为字符串。 // 将单元格内容转化为字符串 private static String convertCellValueToString(Cell cell) {if (null cell) {return null;}String returnValue null;switch (cell.getCellType()) {case STRING: //字符串returnVa…