【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中间元素的迭代器