zoukankan      html  css  js  c++  java
  • 第三章字符串.向量和数组

    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. 指针和迭代器不可相加但可相减。
  • 相关阅读:
    【泛型方法】
    【为什么使用泛型?】
    【泛型类】
    【泛型:ArrayListDemo】
    【泛型概述】
    【Collections:集合工具类:扑克游戏】
    【Collections:集合工具类:自然排序和比较器排序】
    Navicat for MYSQL 断网时本地连接无法打开,2005错误
    Navicat for MYSQL 数据库手动同步方法
    spring redis @Cacheable注解使用部分错误及无效原因
  • 原文地址:https://www.cnblogs.com/m-evan/p/4085172.html
Copyright © 2011-2022 走看看