第三章字符串.向量和数组

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?

http://stackoverflow.com/questions/20998982/whats-the-difference-between-mid-begend-2-and-mid-begend-beg-2-in-binary

  1. 不会产生比end大的中间数据,更安全
  2. 指针和迭代器不可相加但可相减。
posted on 2014-11-09 15:45  路灯Evan  阅读(210)  评论(0编辑  收藏  举报