- 我们在使用输入输出命令时重复的写std::显得很是麻烦。所以可以使用using声明
#include <iostream>
using std::cin;
int main(void)
{
int i;
cin >> i; //正确上面第三行声明
cout << i; //错误,没有相应声明 using std::cout;
std::cout << i; //原来格式
return 0;
}
标准库类型string
- 初始化
string s1; //默认初始化,s1是一个空串
string s2(s1); //s2是s1的副本
string s2 = s1; //等价于s2(s1),s2是s1的副本
string s3("value") //s3是字面值"value"的副本,除了字面值最后的那个空字符外
string s4(n, 'c') //把s4初始化为由连续n个字符c组成的串
- 注意:getline读取对象不包含换行符
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main(void)
{
string line;
while (getline(cin,line)) //读取一行时不换行符会被丢掉
{
cout << line << endl;
}
return 0;
}
练习3.2 编写一段程序从标准输入中一次读入一整行,然后修改该程序使其一次读入一个词。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main(void)
{
string line;
string word;
getline(cin, line);
cin >> word;
cout << line << endl;
cout << word << endl;
return 0;
}
练习3.3:请说明string类的输入运算符和getline函数分别是如何处理空白字符的。
- string类的输入运算符读取第一个非空白字符并在下一个空白停止不包含空白
- getline:已换行符结尾,不读入换行符其他都读
练习3.4:编写程序读入两个字符串,比较其是否相等并输出结构。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main(void)
{
string line;
string word;
getline(cin, line);
getline(cin, word);
if (line > word)
{
cout << line << endl;
}
else if (line < word)
{
cout << word << endl;
}
else
cout << "一样长" << endl;
if (line.size() > word.size())
{
cout << line << endl;
}
else if (line.size() < word.size())
{
cout << word << endl;
}
else
cout << "一样长" << endl;
return 0;
}
- 范围for
for (declaration : expression)
statement
练习3.6:编写一段程序。使用范围for语句将字符串内的所有字符用X代替
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main(void)
{
string line;
cin >> line;
for (auto &i : line)
i = 'X';
cout << line << endl;
return 0;
}
练习:3.8分别用while循环和传统for循环重写第一题,你觉得哪种形式好。
string line;
cin >> line;
// for (char &i : line)
// i = 'X';
// cout << line << endl;
decltype(line.size()) i = 0;
while (i < line.size())
{
line[i++] = 'X';
}
i = 0;
for ( i = 0; i < line.size(); i++)
{
line[i] = 'X';
}
cout << line << endl;
return 0;
3.10:编写一个程序,读入一个包含标点符号的字符串,将标点符号取出后输出字符串剩余的类容
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string line;
cin >> line;
for (auto i : line)
{
if (!ispunct(i))
cout << i;
}
return 0;
}
vector
-
初始化
练习3.12:下列vector对象定义有不正确的吗?
(a)vector<vector<int>> ivec; // 创建<vector<int>>的对象
(b)vector<string> svec = ivec; //不合法,类型不一样ivec是<vector<int>>
(c)vector<string> svec(10, "null"); //合法创建10个元素初始为null
练习3.14:编写一个程序,用cin读入一组整数并把它们存入一个vector对象。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(void)
{
int num;
vector<int> temp;
while (cin >> num)
{
temp.push_back(num);
}
}
练习3.15:改写上提的程序。不过这次读入的是字符串。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(void)
{
string n;
vector<string> temp;
while (cin >> n)
{
temp.push_back(n);
}
}
vector操作
练习3.16:编写一段程序,把练习3.13中vector对象的容量和具体内容输出出来。
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
int main(void)
{
string str;
vector<string> tem;
while (cin >> str)
{
tem.push_back(str);
}
for (auto &i : tem)
{
for (auto &c : i)
{
c = toupper(c);
cout << c;
}
cout << endl;
}
}
练习3.19:如果想定义一个含有10个元素的vector对象,所有元素的值都是42,请列举出三种不同的实现方法
vector<int> v1(10, 42);
vector<int> v2(v1);
vector<int> v3{42,42,42...};
练习3.20:读入一组整数并把它们存入vector对象,输出第一个和最后一个元素的和,以此类推
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
int main(void)
{
int num;
vector<int> tem;
while (cin >> num)
{
tem.push_back(num);
}
vector<int>::size_type i, j;
j = tem.size();
for ( i = 0; i < j / 2; i++)
{
cout << tem[i] + tem[j - i - 1] << " ";
}
if (j % 2 != 0)
{
cout << tem[i]; //输出是奇数的情况
}
}
迭代器
运算符
练习3.23:编写一个程序。将原来的值通过迭代器增加两倍
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
int main(void)
{
vector<int> v1(10, 2);
for (auto iter = v1.begin(); iter != v1.end(); iter++)
*iter = *iter * 2;
for (auto iter = v1.begin(); iter != v1.end(); iter++)
cout << *iter << " ";
}
迭代器加减并不是对值进行加减。
练习 3.26:在二分搜索中,为什么用的是mid = beg + (end-beg) / 2而不是mid = (beg + end) / 2
练习3.43:使用3个版本for打印ia
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
int main(void)
{
int ia[3][4] =
{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
for (const int (&r)[4] : ia)
{
for (const int i : r)
{
cout << i << " ";
}
cout << endl;
}
int (*p)[4] = ia;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << p[i][j] << " ";
}
cout << endl;
}
for ( int (*pt)[4] = ia; pt != ia + 3; pt++)
{
for ( int *q = *pt; q != *pt + 4; q++)
{
cout << *q << " ";
}
cout << endl;
}
return 0;
}