c++primer总结/第三章 字符串.向量和数组

本文探讨了C++中字符串的初始化、getline技巧,size()和length()的区别,字符串相加,以及vector容器的使用、二分查找和迭代器的深入理解。还特别强调了头文件避免using声明的原则和C风格字符串的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.头文件不应使用using声明

作为头文件,一般不要使用using.因为作为头文件,可能被其它文件应用.那么就会把using带过去.造成无法预料的名字冲突;

2.字符串

1.拷贝初始化和直接初始化
string s3 = "hello";	//拷贝初始化
string s4("hello");		//直接初始化.两者等价

//对于一些特殊字符串,比如 n 个 'c'这种,建议用直接初始化!因为拷贝初始化需要显性创建一个对象
string s5(n,'c'); //推荐

string s6 = string(n,'c'); 	//不推荐 
等价于
{
    string temp(n,'c');
    s6 = temp;
}
2.读取一行getline()

输入想要保留换行符,用getline代替cin;

3.size(),length()注意点

string.size().string.length() 的返回值均为size_type ,是一个unsigned int类型.

如果与负数比较,需要注意会负数会为正数.

4.相加
//!字符串字面值与string类型不是同一个类型!
string str = "    hello," + "world     "; //错误,两个字面值不能直接相加
string str = "    hello," + "world     " + str;	//错误.两个字面值不能直接相加
string str = str + "    hello," + "world     "; //正确
5.初始值
//创建一个字符串时,默认有'\0’;所以合法
string s;				
cout << s[0] << endl;

3.vector

1.函数
申请一个容器vector<(int,类,vector容器嵌套)> v
v1 = v2容器赋值,等于另外一个容器
assign(v2开始点,v2结束点)/assign(n,elem)用v2赋值[左闭右开) /赋值n个elem
push_back()尾插
pop_back()删除最后一个
iinsert(const_iterator pos,[int count,]elem)pos位置插入[count]个elem数据
erase(const_iterator start,const_iterator end)从start到end间的元素 [左闭右开)
empty()真则为空
capacity()容量
size()元素个数
resize(int number)重新指定容器长度若容器变长,就以0填充,变短就删除超出部分
resize(int number,elem)重新指定长度,若容器变长,就以elem值填充,变短就删除超出部分
at()访问元素, v.at[i] = v[i]
front()第一个元素
back()最后一个元素
swap()两个容器交换数据 --巧用来收缩空间 vector(v).swap(v) 匿名对象交换
reserve(int len)预留空间(元素不能访问)
clear();清除全部
2.赋值
vector<string> str1("10", "hi");  //{10,hi}
vector<string> str2(10, "hi");	  //10个hi	  
vector<string> str3{10, "hi"};	  //10个hi

vector<int> str4(10, 1);		//10个1
vector<int> str5{ 10, 1 };		//{10,1}
3.可以直接对值进行操作
vector<int> v{ 1,2,3,4,5,6,7 };
for (auto &i : v)
    i *= i;				//可以使得所有值都平方
4.容器的二分查找
vector<int>::iterator beg = v.begin();
vector<int>::iterator end = v.end();
vector<int>::iterator mid = v.begin() + (end - beg) / 2;
int sought = 3;
while (beg != end && *mid != sought)
{
    if (sought < *mid)
        end = mid;
    else
        beg = mid + 1;
    mid = beg + (end - beg) / 2;
}
5.!注意!:
  • 在使用循环,容器大小作为循环次数时,是不要添加元素,会陷入死循环.

4.迭代器

1.类型
//两种类型
iterator 		//普通迭代器,能读能写	容器.begin(), .end();
const_iterator  //常量迭代器,只能读不能写 容器.cbegin(),.cend();
2.解引用
(*it).empty() = it->empty()	//如果解引用对象有该函数即正确
*it.empty()					//错误,圆括号不可少
3.迭代器运算
运算作用
iter +n加上一个整数值还是一个迭代器,向前移动n个元素
iter - n减上一个整数值还是一个迭代器,向后移动n个元素
iter += n赋值语句,把迭代器里的值加上n后赋值给迭代器的值
iter -= n赋值语句,把迭代器里的值减去n后赋值给迭代器的值
iter1 - iter2两个迭代器相减结果为它们间的距离

5.数组

char a1[] = {'C','+','+'};		//列表初始化,没有空字符结尾
char a2[] = {'C','+','+','\0'};	//列表初始化,显性空字符结尾
char a3[] = "c++";				//自动添加空字符结尾
char a4[6] = "Daniel";			//错误,没有位置放空字符

6. C风格字符串

函数意义
strlen§返回p的长度,空字符不计算在内.必须有’\0’结尾
strcmp(p1,p2)比较p1p2的相等性。如果p1==p2,返回0;如果p1>p2,返回一个正值;如果p1<p2,则返回一个负值
strcat(p1,p2)p2附加到p1之后,返回p1
strcpy(p1,p2)p2拷贝给p1,返回p1

char[] 不能直接比较,只能用strcmp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

公仔面i

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值