字符串、向量和数组
1、标准库string
1.1、使用string类型必须首先包含string头文件。
1.2、定义和初始化string对象:string s4(n,'c')=把s4初始化为连续n个字符串c组成的串。
1.3、getline(is,s):从is中读取一行赋值给s,返回is。
1.4、string对象自动忽略开头的空白。
1.5、字面值和string相加时,必须确保每个加法运算符两侧的运算对象至少有一个是string。
练习3.2:编写一段程序从标准输入中一次读取一整行,然后修改使其一次读入一个词。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1;
getline(cin,s1);//一次读取一整行
/*while(cin >> s1)
cout << s1;
一次读取一个单词*/
cout << s1 << endl;
system("pause");
}
练习3.4
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1, s2;
cin >> s1 >> s2;
if (s1 == s2)
cout << "s1 is equal to s2,and result is:" << s1 << endl;
else
{
if (s1 > s2)
cout << "s1 is not equal to s2,the biger string is:" <<s1<< endl;
else
cout << "s1 is not equal to s2,the biger string is:" << s2 << endl;
}
system("pause");
}
是否等长?
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1, s2;
cin >> s1 >> s2;
if (s1.size() > s2.size())
cout << s1 << endl;
else{
if (s1.size() < s2.size())
cout << s2 << endl;
else
cout << "s1.size==s2.size" <<s1<< endl;
}
system("pause");
}
练习3.5
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1,sum_s1;
while (cin >> s1)
sum_s1 += s1+" ";
cout << sum_s1 << endl;
system("pause");
}
3.6编写一段程序,使用范围for语句将字符串内所有字符用X替换。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "fsdrfqewdfwrf";
cout << s1 << endl;
for (auto &c : s1)
c = 'X';
cout << s1 << endl;
system("pause");
}
3.7、结果与3.6一样。
3.10编写一段程序,读入一个包含 标点符号的字符串,将标点符号取出后输出。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1,s2;
cin >> s1;
for (auto &c : s1)
{
if (!ispunct(c))
s2 += c;
}
cout << s2 << endl;
system("pause");
}
2.标准库类型vector
2.1.vector表示对象的集合,其中所有对象的类型都相同。
2.2.vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型。
2.3.vector对象初始化.
默认初始化:vector<string>svec;//svec不含任何元素
值初始化:vector<string>svec(10);//10个元素,每个都初始化为0
vector<int>v1(10);//v1有10个元素。
vector<int>v1{10};//v1有一个元素。
vector<string>v1{10};//v1有10个元素。
2.4.若循环体内部包含有向vector对象添加元素的语句,则不能使用范围for语句。
2.5. vector对象的下标运算符可用于访问已存在的对象,不能用下标形式添加元素。
练习3.14
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>ivec;
int num;
while (cin >> num)
{
ivec.push_back(num);
}
for (auto i:ivec)
cout << i <<endl;
system("pause");
}
练习3.17
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<string>ivec;
string num;
while (cin >> num)
{
ivec.push_back(num);
}
for (auto &i : ivec)
{
for (auto &j : i)
j = toupper(j);
}
for (auto item : ivec)
cout << item << endl;
system("pause");
}
练习3.20
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>ivec;
int num;
while (cin >> num)
{
ivec.push_back(num);
}
for (int i = 0; i < ivec.size() - 1; ++i)
{
cout << ivec[i] + ivec[i + 1] << endl;
++i;
}
system("pause");
3.迭代器
3.1、有迭代器的类型同时拥有返回迭代器的成员。
3.2、解引用迭代器可获得迭代器所指的对象。
3.3、箭头运算符把解引用和成员访问两个操作结合在一起。it->mem和(*it).men意思相同。
3.4、凡是使用了迭代器的循环体,都不要向迭代器所属容器添加元素。
练习3.21
<span style="font-size:14px;">#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>ivec;
int num;
while (cin >> num)
{
ivec.push_back(num);
}
for (auto i=ivec.begin(); i!=ivec.end(); ++i)
cout <<*i + *(++i) << endl;
system("pause");
}</span>
练习3.22
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<string> text = {"sfqefegergqrgrrwgwqg qwrgqwgqwg wrgqwrgwqr rwg","","dwefwefwef ef ef"};
for (auto it = text.begin(); it != text.end() && !(*it).empty(); ++it)
{
for (auto &item : *it)
item = toupper(item);
cout << *it << endl;
}
system("pause");
}
练习3.25
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<unsigned>scores(11, 0);
unsigned grade;
vector<unsigned>::iterator iter = scores.begin();
while (cin >> grade)
{
if (grade <= 100)
++*(iter + (grade / 10));
}
for (auto i : scores)
cout << i << " ";
system("pause");
}
4.数组
4.1、不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值。
4.2、使用数组下标时,通常将其定义为size_t类型。
4.3、使用数组名称可以看做指向数组首元素的指针。
4.4、使用范围for语句出了力多为数组时,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。