第三章字符串.向量和数组
3.2标准库类型 string
- 如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,则执行的是直接初始化。当初始值只有一个时,使用直接初始化或拷贝初始化都行。如果像上面的s4那样初始化要用到的值有多个,一般来说只能使用直接初始化的方式。
- 在执行读取操作时,string对象会自动忽略开头的空白(即空格符,换行符,制表符等)并从第一个真正的字符开始读起,知道遇见下一处空白为止。
- 使用getline()函数从给定的输入流中读入内容,知道遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意不存在换行符)。
- 如果一条表达式中已经有了size()函数就不要再使用int了,这样可以避免混用int 和unsigned可能带来的问题。
- 字符串字面值与string是不同的类型。
练习3.5编写一段程序从标准输入中读入多个字符串并用空格分隔开
#include <iostream> #include <string> using std::string; using std::cin; using std::cout; using std::endl; int main() { string largeStr; string str; while (cin >> str) { if (largeStr.empty()) largeStr += str; else largeStr += " " + str; } cout << "The concatenated string is " << largeStr << endl; return 0;
练习3.11下面的范围for语句合法吗?如果合法,c的类型是什么?
const string s = "Keep out!"; for (auto &c : s){/*... */}
When you don't change c
's value, it's legal, else it's illegal.
For example:
cout << c; // legal.
c = 'X'; // illegal.
The type of c
is const char&
. read-only variable is not assignable.
3.3标准库类型vector
练习3.24:请使用迭代器重做3.3.3节的最后一个练习(读入一组整数并把他们存入一个vector对象,先输出第一个和最后一个元素的和,接着输出第二个和倒数第二个元素的和,以此类推)
#include<iostream> #include<vector> using namespace std; int main() { int a; vector<int> v; while(cin>>a) v.push_back(a); auto head = v.begin(), tail = v.end(); for(;head<tail-1;++head,--tail) { cout<<*head+*(tail-1)<<endl; } return 0; }
这是我做的第一个版本,但是在StackOverflow上看到相同问题,发现没有检查vector是空的的情况。修改版:
#include <iostream> #include <vector> #include <iterator> using std::vector; using std::cout; using std::endl; using std::cin; int main() { int i; vector<int> ivec; while (cin >> i) ivec.push_back(i); if (ivec.empty()) { cout << "input at least one integer." << endl; return -1; } else if(ivec.size() == 1) { cout << *ivec.begin() << " has no adjacent elements."; } for (auto it = ivec.begin(); it+1 != ivec.end(); ++it) cout << *it + *(it+1) << " "; cout << endl; for (auto beg = ivec.begin(), end = ivec.end()-1; beg <= end; ++beg, --end) cout << *beg + *end << " "; cout << endl; return 0; }
(form github)https://github.com/Mooophy/Cpp-Primer/blob/master/ch03/ex3_24.cpp
练习3.26:在100页的二分搜索程序中,为什么用的是mid=beg+(end-beg)/2,而非mid = (beg+end)/2?
- 不会产生比end大的中间数据,更安全
- 指针和迭代器不可相加但可相减。