CC14.【C++ Cont】string类字符串的push_back、pop_back、字符串+=与+运算和insert

目录

1.push_back函数

示例代码1:尾插一个字符

运行结果

示例代码2:使用循环连续尾插多个字符

运行结果

2.pop_back函数

示例代码1:尾删一个字符

运行结果

示例代码2:尾删多个字符

运行结果

注意事项

错误代码

运行结果

示例代码3:循环删除字符

 运行结果

3.+=和+运算

示例代码1:尾部添加字符串

运行结果

示例代码2:头部添加字符串

运行结果

4.insert函数

1.插入string类字符串

运行结果

2.插入C语言风格的字符串

执行结果

3.批量插入n个相同的字符

运行结果


★2024年最后一篇★

1.push_back函数

显然是尾插(之前讲过SLPushBack函数,参见83.【C语言】数据结构之顺序表的尾部插入和删除文章)

因此push_back()用于在字符串尾部插一个字符

示例代码1:尾插一个字符

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s = "abcde";
	s.push_back('f'); //在字符串s的尾部插入字符f
	cout<<s;
	return 0;
}

运行结果

示例代码2:使用循环连续尾插多个字符

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	for (char i='a';i<='z';i++)
	{
		s.push_back(i);
	}
	cout<<s;
	return 0;
}
运行结果

2.pop_back函数

显然是尾删, (之前讲过SLPopBack函数,参见83.【C语言】数据结构之顺序表的尾部插入和删除文章)

pop_back用于在字符串尾部删除一个字符(C++11才引入)

示例代码1:尾删一个字符

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s = "abcde";
	s.pop_back();
	cout<<s;
	return 0;
}
运行结果

示例代码2:尾删多个字符

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("abcdefghi");
	short n=5; 
	while (n--)//尾删5次
	{
		s.pop_back();
	}
	cout<<s;
	return 0;
}
运行结果

注意事项

当字符串为空时,禁止使用pop_back!!

错误代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	s.pop_back();
	cout<<s;
	return 0;
}
运行结果

报错提示:size()为0,不能删字符串,而且是未定义行为

参见cplusplus官网的说明https://legacy.cplusplus.com/reference/string/string/pop_back/

示例代码3:循环删除字符

注意:size()不为0时才能删除,因此需要判断

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s="abcdefg";
	while(s.size())
		s.pop_back();
	cout<<s.size();
	return 0;
}
 运行结果

3.+=和+运算

示例代码1:尾部添加字符串

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s="abc";
	s+="def";//s的字符串已被修改
	cout<<s;
	return 0;
}

注意:在s+="def";中,字符串s已被修改

运行结果

 对比下面的代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s="abc";
	cout<<s+"def"<<endl;//s并没有改变
	cout<<s;
	return 0;
}

注意:在cout<<s+"def"<<endl;中,字符串s并没有改变,只是s和"def"放在一起打印了

 尾部添加字符串也可以用strcat函数,参见52.【C语言】 字符函数和字符串函数(strcat函数)文章

示例代码2:头部添加字符串

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s="abc";
	s="def"+s;
	cout<<s;
	return 0;
}
运行结果

和示例代码1对比可以看出:s="def"+s;s=s+"def";的结果是不同的!!!一个是头部追加,一个是尾部追加

4.insert函数

类比85.【C语言】数据结构之顺序表的中间插入和删除及遍历查找文章的SLInstert函数,显然insert用于在字符串中间的某个位置插入一个字符串

cplusplus对insert的介绍 点我跳转中该函数的用法有很多种,这里简单介绍其中的三种

string& insert (size_t pos, const string& str); //pos位置前面插入一个string字符串
string& insert (size_t pos, const char* s); //pos位置前面插入一个C风格的字符串
string& insert (size_t pos, size_t n, char c); //pos位置前面插入n个字符c

注意:1.都是在pos位置前(注意pos为0为第一个字符,下标从0开始)处理字符串 2.第二个参数的类型可以有三种 3.返回值为string& insert

1.插入string类字符串

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string ori="abfg";
	string insert_str="cde";
	ori.insert(2,insert_str);
	cout<<ori; 
	return 0;
}
运行结果

2.插入C语言风格的字符串

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string ori="abfg";
	char insert_str[]="cde";
	ori.insert(2,insert_str);//写法等同于ori.insert(2,"cde");
	cout<<ori; 
	return 0;
}

 C语言风格的字符串存储在字符数组中,因此传字符数组的指针

执行结果

3.批量插入n个相同的字符

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string ori="abfg";
	char insert_str[]="cde";
	ori.insert(2,7,'A');//在b的前面插入7个A
	cout<<ori; 
	return 0;
}
运行结果

优化这个sql SELECT count( 1 ) FROM ( SELECT B.ID, B.PURCHASE_REQUEST_ID, B.MATERIAL_ID, B.MATERIAL_CODE, B.MATERIAL_NAME, B.STANDARD, B.MODEL_ID, B.BILL_ROW_ID, B.BILL_NO, BILL_NAME, B.MODEL_CODE, B.MODEL_NAME, B.PARENT_MODEL_ID, B.PARENT_MODEL_CODE, B.PARENT_MODEL_NAME, B.UNIT_CODE, B.UNIT_NAME, B.PURCHASE_TYPE_CODE, CAST( NVL( B.APPLY_NUM, 0 ) AS NUMBER ( 24, 10 ) ) AS APPLY_NUM, CAST( NVL( B.DEAL_NUM, 0 ) AS NUMBER ( 24, 10 ) ) AS DEAL_NUM, CAST( NVL( B.RETURN_NUM, 0 ) AS NUMBER ( 24, 10 ) ) AS RETURN_NUM, B.DEAL_USER_ID, B.DEAL_USER_NAME, CAST( NVL( B.PRICE, 0 ) AS NUMBER ( 24, 10 ) ) AS PRICE, CAST( NVL( B.AMOUNT, 0 ) AS NUMBER ( 24, 10 ) ) AMOUNT, B.IMPLEMENT_CODE, B.IMPLEMENT_NAME, B.IMPLEMENT_INVEST_AMOUNT, B.PURCHASE_MANAGER_ID, B.PURCHASE_MANAGER_NAME, B.PROVIDER_ID, B.PROVIDER_NAME, B.REMARK, B.DELIVER_AREA, B.DELIVER_ADDRESS, B.RECEIVE_PEOPLE, B.RECEIVE_PEOPLE_PHONE, B.ITEM_STATUS, B.COST_CENTER, B.COST_BUDGET_CODE, B.COST_IMPLEMENT_NAME, B.FRAME_CONT_ID, B.FRAME_CONT_CODE, B.FRAME_CONT_NAME, B.DETAIL_CONFIG, B.PURCHASE_CATEGORY_CODE, B.INVOICE_TITLE_CODE, B.INVOICE_SEND_ADDRRSS, B.MATERIAL_REQUEST_ITEM_ID, B.YEAR, B.DELETE_FLAG, B.PROVINCE_CODE, B.REASON, B.PARENT_ITEM_ID, B.FRAME_CONT_ITEM_ID, B.SUB_MATERIAL_REQUEST_ID, B.SUB_MATERIAL_REQUEST_CODE, B.MATERIAL_URL, B.RECOMMEND_PROVIDER_NAMES, C.PURCHASE_REQUEST_CODE, C.PURCHASE_REQUEST_NAME, C.APPLY_TYPE_CODE, C.CREATOR_NAME, C.APPLY_TELEPHONE, C.COMPANY_NAME, C.DEPT_NAME, B.CREATE_TIME, TO_CHAR( B.CREATE_TIME, 'YYYY-MM-DD' ) CREATE_TIME_STR, C.ARRIVE_TIME, C.IS_TO_END, C.MONEY_WAY_CODE, C.OWN, C.APPLY_CATEGORY_CODE, C.manu_Type, C.BILL_ID, MMD.MATERIAL_TYPE_CODE, B.BRANCH_COMPANY_DEAL_USER_ID, B.BRANCH_COMPANY_DEAL_USER_NAME, ( SELECT ORG_NAME FROM ORGANIZATIONS WHERE DELETE_FLAG = '0' AND ORG_CODE = ( SELECT PARENT_COMPANY_NO FROM ORGANIZATIONS WHERE ID = B.MATERIAL_DEPT_ID )) AS MATERIAL_COMPANY_NAME, B.ORIGINAL, B.PROVIDER_PRODUCT_MODEL, B.PROVIDER_PRODUCT_NAME, B.PRODUCT_DESC, B.Back_Flag, CASE WHEN MMD.material_type_code = 'WZ' THEN '1' WHEN MMD.material_type_code = 'FW' THEN '2' ELSE '3' END apply_category_code_item, NVL( C.IS_CARDSYSTEM_REQUEST, '0' ) IS_CARDSYSTEM_REQUEST, B.APPLY_GROUP_AUTHORITES, B.SCIENTIFIC_RESEARCH_ID, B.SCIENTIFIC_RESEARCH_CODE, B.SCIENTIFIC_RESEARCH_NAME, B.PREQUALFY_CODE, nvl( C.IS_QUICK, '0' ) AS IS_QUICK, C.PURCHASE_WAY_CODE, C.PURCHASE_TYPE_CODE PURCHASE_TYPE_CODE_P, C.ORIGINAL_TYPE, C.PURCHASE_REQUEST_BILLS_TYPE, B.IS_FRAME_CONT_MONAD FROM PURCHASE_REQUEST_ITEM B LEFT JOIN PURCHASE_REQUEST C ON B.PURCHASE_REQUEST_ID = C.ID LEFT JOIN MATERIAL_DATA MMD ON MMD.ID = B.MATERIAL_ID AND MMD.DELETE_FLAG = '0' WHERE B.delete_flag = '0' AND B.Item_Status IN ( 1 ) AND NOT EXISTS ( SELECT * FROM purchase_request_item_log pril WHERE B.id = pril.purchase_request_item_id AND pril.lock_status = '1' AND pril.delete_flag = '0' ) AND ( ( c.apply_type_code NOT IN ( '20', '41', '3' ) AND nvl( B.Apply_Num, 0 ) > nvl( B.Deal_Num, 0 )) OR c.apply_type_code IN ( '20', '41', '3' ) ) AND B.Deal_User_Id =: 1 AND C.MONEY_WAY_CODE =: 2 AND C.APPLY_TYPE_CODE =: 3 AND C.PAY_OUT_TYPE_CODE =: 4 AND C.APPLY_CATEGORY_CODE =: 5 AND NVL( C.IS_CARDSYSTEM_REQUEST, '0' ) = : 6 AND NOT EXISTS ( SELECT * FROM purchase_request_item p left join material_province mp ON p.material_id = mp.material_id WHERE p.delete_flag = 0 AND mp.delete_flag = 0 AND mp.material_status = 03 AND mp.org_code = p.province_code AND p.id = B.id ) ORDER BY C.ID, B.ID ASC)
06-08
首先,可以将子查询中的所有列名改为别名,这样可以避免重名提高代码可读性。另外,可以尝试使用 EXISTS 子查询来替换 NOT EXISTS 子查询,因为 EXISTS 子查询的性能通常更好。最后,可以考虑对 WHERE 子句中的多个条件进行逻辑上的分组,以避免出现过于复杂的条件表达式。下面是优化后的 SQL: SELECT COUNT(1) FROM ( SELECT b.ID, b.PURCHASE_REQUEST_ID, b.MATERIAL_ID, b.MATERIAL_CODE, b.MATERIAL_NAME, b.STANDARD, b.MODEL_ID, b.BILL_ROW_ID, b.BILL_NO, b.BILL_NAME, b.MODEL_CODE, b.MODEL_NAME, b.PARENT_MODEL_ID, b.PARENT_MODEL_CODE, b.PARENT_MODEL_NAME, b.UNIT_CODE, b.UNIT_NAME, b.PURCHASE_TYPE_CODE, CAST(NVL(b.APPLY_NUM, 0) AS NUMBER(24, 10)) AS APPLY_NUM, CAST(NVL(b.DEAL_NUM, 0) AS NUMBER(24, 10)) AS DEAL_NUM, CAST(NVL(b.RETURN_NUM, 0) AS NUMBER(24, 10)) AS RETURN_NUM, b.DEAL_USER_ID, b.DEAL_USER_NAME, CAST(NVL(b.PRICE, 0) AS NUMBER(24, 10)) AS PRICE, CAST(NVL(b.AMOUNT, 0) AS NUMBER(24, 10)) AMOUNT, b.IMPLEMENT_CODE, b.IMPLEMENT_NAME, b.IMPLEMENT_INVEST_AMOUNT, b.PURCHASE_MANAGER_ID, b.PURCHASE_MANAGER_NAME, b.PROVIDER_ID, b.PROVIDER_NAME, b.REMARK, b.DELIVER_AREA, b.DELIVER_ADDRESS, b.RECEIVE_PEOPLE, b.RECEIVE_PEOPLE_PHONE, b.ITEM_STATUS, b.COST_CENTER, b.COST_BUDGET_CODE, b.COST_IMPLEMENT_NAME, b.FRAME_CONT_ID, b.FRAME_CONT_CODE, b.FRAME_CONT_NAME, b.DETAIL_CONFIG, b.PURCHASE_CATEGORY_CODE, b.INVOICE_TITLE_CODE, b.INVOICE_SEND_ADDRRSS, b.MATERIAL_REQUEST_ITEM_ID, b.YEAR, b.DELETE_FLAG, b.PROVINCE_CODE, b.REASON, b.PARENT_ITEM_ID, b.FRAME_CONT_ITEM_ID, b.SUB_MATERIAL_REQUEST_ID, b.SUB_MATERIAL_REQUEST_CODE, b.MATERIAL_URL, b.RECOMMEND_PROVIDER_NAMES, c.PURCHASE_REQUEST_CODE, c.PURCHASE_REQUEST_NAME, c.APPLY_TYPE_CODE, c.CREATOR_NAME, c.APPLY_TELEPHONE, c.COMPANY_NAME, c.DEPT_NAME, b.CREATE_TIME, TO_CHAR(b.CREATE_TIME, 'YYYY-MM-DD') CREATE_TIME_STR, c.ARRIVE_TIME, c.IS_TO_END, c.MONEY_WAY_CODE, c.OWN, c.APPLY_CATEGORY_CODE, c.manu_Type, c.BILL_ID, MMD.MATERIAL_TYPE_CODE, b.BRANCH_COMPANY_DEAL_USER_ID, b.BRANCH_COMPANY_DEAL_USER_NAME, (SELECT ORG_NAME FROM ORGANIZATIONS WHERE DELETE_FLAG = '0' AND ORG_CODE = (SELECT PARENT_COMPANY_NO FROM ORGANIZATIONS WHERE ID = b.MATERIAL_DEPT_ID)) AS MATERIAL_COMPANY_NAME, b.ORIGINAL, b.PROVIDER_PRODUCT_MODEL, b.PROVIDER_PRODUCT_NAME, b.PRODUCT_DESC, b.Back_Flag, CASE WHEN MMD.material_type_code = 'WZ' THEN '1' WHEN MMD.material_type_code = 'FW' THEN '2' ELSE '3' END apply_category_code_item, NVL(c.IS_CARDSYSTEM_REQUEST, '0') IS_CARDSYSTEM_REQUEST, b.APPLY_GROUP_AUTHORITES, b.SCIENTIFIC_RESEARCH_ID, b.SCIENTIFIC_RESEARCH_CODE, b.SCIENTIFIC_RESEARCH_NAME, b.PREQUALFY_CODE, NVL(c.IS_QUICK, '0') AS IS_QUICK, c.PURCHASE_WAY_CODE, c.PURCHASE_TYPE_CODE PURCHASE_TYPE_CODE_P, c.ORIGINAL_TYPE, c.PURCHASE_REQUEST_BILLS_TYPE, b.IS_FRAME_CONT_MONAD FROM PURCHASE_REQUEST_ITEM b LEFT JOIN PURCHASE_REQUEST c ON b.PURCHASE_REQUEST_ID = c.ID LEFT JOIN MATERIAL_DATA MMD ON MMD.ID = b.MATERIAL_ID AND MMD.DELETE_FLAG = '0' WHERE b.delete_flag = '0' AND b.Item_Status IN (1) AND b.Deal_User_Id = :1 AND C.MONEY_WAY_CODE = :2 AND C.APPLY_TYPE_CODE = :3 AND C.PAY_OUT_TYPE_CODE = :4 AND C.APPLY_CATEGORY_CODE = :5 AND NVL(C.IS_CARDSYSTEM_REQUEST, '0') = :6 AND EXISTS ( SELECT * FROM purchase_request_item_log pril WHERE B.id = pril.purchase_request_item_id AND pril.lock_status = '1' AND pril.delete_flag = '0' ) AND ( c.apply_type_code IN ('20', '41', '3') OR ( c.apply_type_code NOT IN ('20', '41', '3') AND NVL(b.Apply_Num, 0) > NVL(b.Deal_Num, 0) ) ) AND NOT EXISTS ( SELECT * FROM purchase_request_item p LEFT JOIN material_province mp ON p.material_id = mp.material_id WHERE p.delete_flag = 0 AND mp.delete_flag = 0 AND mp.material_status = 03 AND mp.org_code = p.province_code AND p.id = b.id ) ORDER BY c.ID, b.ID ASC )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangcoder

赠人玫瑰手有余香,感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值