C++primer知识要点总结_3

【1】读取string

  • 使用cin读取string的时候,string会自动忽略开头的空白,并从第一个字符读起直到下一个空白为止,因此cin读入的是单个的单词。
  • 使用getline读取string的时候,保留了输入的时候的空白符,读到换行符为止,并将换行符也读入了字符串中。
string s1;
getline(cin, s1);//cin>>s1;
cout << s1;

【2】处理string对象中的字符

  • 使用基于范围的for语句访问每个字符
string str("Cali is handsome!")for(auto c: str)
	cout<<c<<endl;
  • 使用基于范围的for语句改变每个字符
string str("Cali is handsome!");
for (auto&c : str)
	c = toupper(c);//要想改变对象中字符的值,只能把循环变量定义为引用
cout << s << endl;
  • 处理一部分字符

要访问string对象中的单个字符有两种方式:一种是使用下标,一种是使用迭代器。其中下标必须大于等于0且下雨s.size()。

  • 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1;
	getline(cin, s1);
	for (auto c : s1)
	{
		if (!ispunct(c))
			cout << c;
	}
	return 0;
}

【3】标准库类型vector

  • vector表示对象的集合,其中所有的对象都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象。因为vector里面“容纳着”其他对象,所以也被叫做容器。
  • 在定义和初始化vector对象的时候注意初始化列表的使用以及相关的注意事项。
vector<string>v1{abc};//正确的列表初始化
vector<int>v2(10,1);//v2中有10个元素,每个元素的值为1
vector<int>v3{10,1};//v3中有两个元素,值分别是10和1
vector<int>vi=10;//必须用直接初始化的形式指定向量的大小
vector<int>vs(10);//10个元素,每个元素初始化为0
  • 向vector对象中添加元素,注意不能用下标形式添加元素,因为初始的容器是空的。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int a;
	vector<int>a1;
	while (cin >> a)
		a1.push_back(a);
	//for (auto i : a1)
		//cout << i << endl;
	for (int i = 0; i < a1.size(); i++)
	{
		cout << a1[i] << endl;
	}
	return 0;
}
  • 典例:从cin读入一组词并将它们 存入一个vector对象,然后设法把所有词都改写成大写形式。输出改变的结果,没个词占一行。
#include<iostream>
#include<vector>
#include<cctype>
#include<string>
using namespace std;
string Tpper(string);
int main()
{

	string s;
	vector<string>s1;
	while (cin >> s)
	{
		s1.push_back(s);
	}
	for (auto i : s1)
	{
		for (auto j : i)
		{
			j = toupper(j);
		}
	}
	for (auto i : s1)
		cout << i << endl;

	system("pause");
	return 0;
}

【4】迭代器

  • 可以使用下标运算符来访问string的字符和vector对象的元素,string和vector都是标准库类型下的。但是除vector外,标准库还定义了其它一些容器,并不支持下标运算算符,这个时候就需要用到迭代器了。
  • 对于字符串组成的vector对象来说,要检查其元素是否为空,令It是该vector对象的迭代器,只需要检查It所指的字符串为空即可。
*it).empty();//*it.empty();这是错误的,这个访问的是迭代器的成员函数empty(),但是迭代器没有empty()的成员函数。
  • 使用迭代器完成二分搜索
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg) / 2;//注意这里为什么是(end-beg)/2而不是(end+beg)/2,因为text.end()指的是最后一个对象的下一位
while (mid != end && *mid != sought)
{
	if (sought < *mid)
		end = mid;
	else
		beg = mid + 1;
	mid = beg + (end - beg) / 2;
}

auto mid =vi.begin()+vi.size()/2;//计算得到vi中间元素的迭代器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值