首页 > 编程语言 >C++学习笔记之string容器、vector容器

C++学习笔记之string容器、vector容器

时间:2024-11-14 16:17:27浏览次数:3  
标签:容器 cout int printfVector vector v4 string

我们读过的书,说过的话,见过的山水,见到的人和事,最终都会变成我们脚下的的路。


1.string容器

string 是 C++ 风格的字符串,而 string 本质上是一个类。
#include <iostream>
using namespace std;
#include <string>
//以下参数为const char* 类型与string类型的函数参数可以相互替换
void test01()
{
	//一、string构造函数

	string s1;//1.默认构造

	const char* str1 = "max";
	string s3(str1);//2.使用字符串进行初始化构造
	cout << "s3 =" << s3 << endl;

	string s4(s3);//3.使用一个string对象初始化另一个string对象
	cout << "s4 =" <<s4 <<endl;

	string s5(7, 'x');
	cout << "s5=" <<s5<< endl;

	//二.赋值方式
	const char* str2 = "min";
	s5 = str2;//char*类型字符串 赋值给当前的字符串
	cout << "s5=" << s5 << endl;

	s5 = s4;//把字符串s赋给当前的字符串
	cout << "s5=" << s5 << endl;

	s5 = 'a';//字符赋值给当前的字符串
	cout << "s5=" << s5 << endl;

	s5 = str2;//char*类型字符串 赋值给当前的字符串
	s5 = "hello,world";
	cout << "s5=" << s5 << endl;

	s5.assign(str2);//把字符串s赋给当前的字符串
	cout << "s5=" << s5 << endl;

	s5.assign(str2,2);//把字符串s的前n个字符赋给当前的字符串
	cout << "s5=" << s5 << endl;

	s5.assign(s4);//把字符串s赋给当前字符串
	cout << "s5=" << s5 << endl;

	s5.assign(2, 's');//用n个字符c赋给当前字符串
	cout << "s5=" << s5 << endl;

 //三、字符串拼接


	s5 += "rr";//string& operator+=(const char* str);重载+=操作符
	cout << "s5=" << s5 << endl;

	s5 += 'a';//string& operator+=(const char c); //重载+=操作符
	cout << "s5=" << s5 << endl;

	s5 += s4;//string& operator+=(const string& str); //重载+=操作符
	cout << "s5=" << s5 << endl;

	string str11 = "I LOVE ";
    str11.append("my country");//string& append(const char *s); //把字符串s连接到当前字符串结尾
	cout << "str11=" << str11 << endl;

	str11.append("tooooo",2);//string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾
	cout << "str11=" << str11 << endl;

	string str12 = "1";
	str11.append(str12);//string& append(const string &s); //同operator+=(const string& str)
	cout << "str11=" << str11 << endl;

	string str13 = "2223333";//string& append(const string &s, int pos, int n); //字符串s中从pos开始的n个字符连接到字符串结尾
	str11.append(str13,3,3);
	cout << "str11=" << str11 << endl;

//四、查找和替换

	//find查找是从左往后,rfind从右往左;
	// find找到字符串后返回查找的第一个字符位置,找不到返回-1;
	// replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串
	string str111="yue shi gu xiang ming";
	int pos1 = str111.find("ng");//int find(const string& str, int pos = 0) const;查找str第一次出现位置,从pos位置开始查找
	cout << "pos1=" << pos1 << endl;
	int pos4 = str111.find("ng",0,1);//int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
	cout << "pos4=" << pos4 << endl;
	int pos2 = str111.rfind("ng"); //int rfind(const string& str, int pos = npos) const;查找str最后一次位置, 从pos开始查找
	cout << "pos2=" << pos2 << endl;
	int pos3 = str111.rfind("ng",21,1); //int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置
	cout << "pos3=" << pos3 << endl;
	
	cout << "替换前str111=" << str111 << endl;
	str111.replace(0,7,"moon is");//替换从pos开始n个字符为字符串str
	cout << "替换后str111=" << str111 << endl;

//五、字符串比较

	//字符串对比主要是用于比较两个字符串是否相等
	string str555 = "hello";
	string str556 = "hello";
	int pos557=str555.compare(str556);//int compare(const string &s) const;返回值为0,二者相等
	int pos558 = str555.compare("hello");//int compare(const char *s) const;
	cout <<"pos557=" << pos557 << endl;
	cout <<"pos558=" << pos558 << endl;

//六、字符串存取

	//string字符串中单个字符存取有两种方式,利用 [ ] 或 at
	string str666 = "hello world";
	for (int i = 0; i < str666.size(); i++)
	{
		cout<<"str666=" << str666[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < str666.size(); i++)
	{
		cout<<"str666" << str666.at(i) << " ";
	}
	cout << endl;
	//字符修改
	str666[0] = 'x';
	str666.at(1) = 'x';
	cout <<"str666" << str666 << endl;

//七、字符串插入与删除
// 
	//插入和删除的起始下标都是从0开始
	string str777 = "hello world";
	str777.insert(2,"llll"); //string& insert(int pos, const char* s); //插入字符串
	cout << "str777=" << str777 << endl;

	str777.insert(8, 3, 'x');//string& insert(int pos, int n, char c); //在指定位置插入n个字符c
	cout << "str777=" << str777 << endl;

	str777.erase(8,3);
	str777.erase(2,4);//string& erase(int pos, int n = npos); //删除从Pos开始的n个字符
	cout << "str777=" << str777 << endl;

//八、string子串
// 
	//从字符串中获取想要的子串
	string str888 = "hello world";
	string str889=str888.substr(0, 5); //string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串
	cout << "str889=" << str889 << endl;
}
int main() {
	test01();
}

2.vector容器

vector数据结构和数组非常相似,也称为单端数组,不同之处在于数组是静态空间,而vector可以动态扩展,动态扩展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。

#include <iostream>
using namespace std;
#include <vector>
void printfVector(vector <int> &v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//iterator(迭代器)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {

//一、vector构造方式
	vector <int> v1;//1.默认构造
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);//尾插
	}
	printfVector(v1);

	vector<int>v2(v1.begin(), v1.end());//2.区间构造
	printfVector(v2);

	vector<int>v3(10, 100);//3.用n个元素的方式构造
	printfVector(v3);

	vector<int>v4(v3);//4.拷贝构造
	printfVector(v4);


//二、vector赋值方式
	v4 = v1;// 1.operator=
	printfVector(v4);

	v4.assign(v3.begin(), v3.end());//2.assign方式
	printfVector(v4);

	v4.assign(5, 20);//3.n个元素的方式
	printfVector(v4);

	//vector容量和大小
	if (v4.empty())//为真代表容器为空
	{
		cout << "v4为空" << endl;
	}
	else
	{
		cout << "v4不为空" << endl;
		cout << "v4的容量" << v4.capacity() << endl;//vector容器容量
		cout << "v4的大小" << v4.size() << endl;//容器的大小
	}

	v4.resize(15, 100);//重新指定容器大小,指定默认填充值
	printfVector(v4);//如果重新指定的过长;如果未指定默认填充值用0填充

	v4.resize(5);//重新指定过短,删除超出的部分
	printfVector(v4);

//三、插入和删除

	//尾插
	v4.push_back(10);
	v4.push_back(20);
	printfVector(v4);

	//尾删
	v4.pop_back();
	printfVector(v4);

	//插入
	v4.insert(v4.begin(), 100);//在迭代器指向的位置插入一个元素
	printfVector(v4);

	v4.insert(v4.begin(), 2, 1000);//在特定位置插入n个指定元素
	printfVector(v4);

	//删除
	v4.erase(v4.begin());//删除迭代器指向的元素
	printfVector(v4);

	v4.erase(v4.begin(), v4.end());//全删
	printfVector(v4);

	//清空
	v3.clear();//清空容器内元素
	printfVector(v3);


	//vector容器中的数据存取
	printfVector(v2);
	cout << v1[2] << endl;//使用[]的方式访问元素
	cout << v1.at(0) << endl;//使用at的方式访问元素
	cout << "最后一个元素为" <<v1.front()<< endl;//获取第一个元素
	cout << "最后一个元素为" <<v1.back()<< endl;//获取最后一个元素

//四、互换元素
	vector<int>v5(10, 100);
	vector<int>v6(10, 200);
	cout << "交换前" << endl;
	printfVector(v5);
	printfVector(v6); 
	v5.swap(v6);//交换 
	cout << "交换后" << endl;
	printfVector(v5);
	printfVector(v6);
	
	v6.resize(3, 10);
	printfVector(v6);
	cout << "重新指定大小后v6的容量大小" << v6.capacity() << endl;
	vector<int>(v6).swap(v6);//巧用swap收缩内存
	printfVector(v6);
	cout << "使用匿名对象的swap函数收缩大小后v6的容量大小" << v6.size() << endl;

//五、预留空间
	vector<int>v7;
	int* p = NULL;
	int num = 0;
	for (int i = 0; i < 1000; i++)
	{
		v7.push_back(i);
		if (p != &v7[0])
		{
			p = &v7[0];
			num++;
		}
		
	}
	cout << num << endl;//容器动态扩展的次数

	vector<int>v8;
	v8.reserve(1000);//使用reserve函数预留空间
	int* p1 = NULL;
	int num1 = 0;
	for (int i = 0; i < 1000; i++)
	{
		v8.push_back(i);
		if (p1 != &v8[0])
		{
			p1 = &v8[0];
			num1++;
		}

	}
	cout << num1 << endl;
}


int main() {
	test01();
}

标签:容器,cout,int,printfVector,vector,v4,string
From: https://blog.csdn.net/qq_64083803/article/details/143685033

相关文章

  • cpp容器迭代器失效
    在C++中,容器迭代器失效通常由以下几种情况引起:内存重新分配:对于std::vector、std::string等序列式容器,如果插入新元素导致当前容量不足,则会重新分配内存空间,导致所有指向该容器元素的迭代器失效。元素插入或删除:对于某些容器(如std::vector、std::deque和std::map),插入或删除元......
  • # StringBoot项目配置SSL证书及配置Nginx ##
    一、证书相关命令1.key转换成.pemopensslrsa-inexample.key-outexample.pem2.crt转换成.pemopensslx509-inexample.crt-outexample.pem二、配置流程1.在nginx目录下创建cert文件夹,导入证书文件及对应的key文件2.修改application.yml配置文件server:port:910......
  • navicat连接远程服务器docker的mysql容器时连不上报错
    报错:1130-HostxxxisnotallowedtoconnecttothisMySQLserver1.原因是root账户没有远程访问权限,先进mysql容器dockerexec-it你的容器id/bin/bash2.连接数据库,输入你的密码mysql-uroot-p3.切换到mysql数据库usemysql;4.更新用户表:(其中%的意思是允许所有的......
  • 解读Karmada多云容器编排技术,加速分布式云原生应用升级
    本文分享自来源:《华为云DTSE》第五期开源专刊,作者:任洪彩华为云高级软件工程师,Karmada社区Maintainer。 管理和协调跨多个云平台的容器化应用是当前企业面临的复杂性挑战之一,Karmada多云容器编排技术使得用户能够像操作单一集群一样轻松管理多集群,简化了多云环境的运维复杂度,加......
  • Langchain and Azure cognitive search - ImportError - cannot import name ‘Vector
    题意:LangchainandAzurecognitivesearch-ImportError-cannotimportname'Vector'from'azure.search.documents.models'“Langchain和Azure认知搜索-导入错误:无法从'azure.search.documents.models'导入名称'Vector'”问题背景:Iam......
  • C++基础语法实现写时复制CowString
    前言: CowString写时复制设计思路难点:通过下标访问字符串元素的基本思路重载[]运算符,在函数中直接返回该位置指针的解引用,但此时返回值为char类型,对于进行单个字符串修改的操作,如:str[1]='H';,无法处理赋值时的写时复制操作,只能通过输出流运算符输出char。解决方法:可以在Cow......
  • STL容器的各个函数方法
    std::vectorstd::vector是一个动态数组,支持随机访问。push_back(value):在末尾添加一个元素。pop_back():移除末尾的元素。size():返回容器中的元素数量。empty():检查容器是否为空。at(index):访问指定位置的元素,带边界检查。front():返回第一个元素。back():返回最后一个元......
  • CICD03 Jenkins对golang项目构建, 结合ansible, 构建通知, 自动化构建(定时,webhook),
    2.7.2基于Maven风格的任务构建基于WAR包运行Tomcat服务器JAVA项目maven配置繁琐,功能固定不灵活,不如自由风格好用,这里推荐用自由风格脚本实现更好目前最高依赖到tomcat9,更高版本的tomcat不支持2.7.2.2安装tomcat服务器和配置#在gitlab新建java项目(此项目使用JD......
  • [Docker#7] 容器 | OOM | 常用命令 | 交互模式 | 批量处理
    目录什么是容器生活案例为什么需要容器?容器的生命周期3种特殊情况3.1容器OOM3.2容器异常退出3.3容器暂停容器命令清单Docker容器常用命令dockercreatedockerrundockerpsdockerlogsdockerexecdockerstartdockerstopdockerrestartdockerkilld......
  • CICD04 Jenkins容器化CICD实现及分布式构建, 流水线Pipeline ubuntu使用
    2.14.3案例:基于Docker插件实现自由风格任务实现Docker镜像制作不如前面的直接脚本编写灵活2.14.3.2安装插件docker-build-stepjenkins上安装docker-build-step插件#选择jenkins使用的docker服务#左侧系统管理,右侧系统配置,DockerBuilder下DockerURL输入un......