zoukankan      html  css  js  c++  java
  • c++ primer 笔记 (三)

    标准库类型string 和 vector ,分别定义了大小可变的字符串和集合。
                    bitset,提供了一个抽象方法来操作位的集合。提供更方便的处理位的方式(相对于整型值上的位操作符)
     
    vector用于保存一组指定类型的对象。
     
    ::作用域操作符    ----  右操作数的名字可以在左操作数的作用域中找到。
     
    using声明
     
    使用标准库类型的定义
    有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。
    理由是头文件的内容会被预处理器复制到程序中。用#include包含文件时,相当于头文件中的文本将成为我们编写文件的一部分。如果在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明,不论该程序是否需要using声明。
     
    通常,头文件中应该只定义确实必要的东西。
     
    字符串字面值与标准库string类型不是同一种类型。
     
    string s;
    cin >> s; // 读取并忽略开头所有的空白字符(如空格,换行符,制表符)
                  //  读取字符直至再次遇到空白字符,读取终止
                  // "    Hello  world! " ---->>>>  Hello
     
    1.读入未知数目的string对象
    把输入操作作为判断条件
    while(cin >> word)
     
    2.用getline读取整行文本(并不忽略行开头的换行符
    getline(cin,line)从输入流的下一行读取,并保存读取的内容到string中,不包括换行符
    一个输入流对象和一个string对象
     
    getline函数返回时丢弃换行符,换行符将不会存储在string对象中
     
    s.size()  s.empty()  s[n]  s1 + s2  
    s1 = s2 v1 == v2
     
    size操作返回的是string::size_type类型的值
    string类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)
     
    定义为与unsigned型具有相同的含义(不知道确切类型),而且可以保证足够大能够存储任意string对象长度。
     
    不要把size的返回值赋给一个int变量
     
    ***********网上找的例子***************

    注意,任何存储string的size操作结果的变量必须为string::size_type类型。尤其不能把size的返回值赋给一个int变量。(因为size返回的是一个unsigned类型,而int是signed类型。size能表达的大小是int的2倍)。

    string str("some string");   //通过字符串字面值赋值给串
    for (string::size_type ix = 0; ix != str.size(); ++ix)   //此处不该为int     用!=,而不用<=
    {
       cout<<str[ix]<<endl;
    }

    vector<int> ivec;
    for(vector<int>::iterator ix = ivec.begin(); ix != ivec.end(); ++ix)   
                                                                            //此处不该为int     用!=,而不用<=

    {
        *ix = 0; //将各个元素赋值为0
    }
    *********************************后来发现在书后面有这个例子
     
     
    string st1, st2 = "The expense of spirit";
    st1 = st2;   /replace st1 by a copy of st2
    效率问题
    .....1先把st1占用的相关内存释放掉
    2分配给st1足够存放st2副本的内存空间
    3把st2中的所有字符复制到新分配的内存空间。....
     
    当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个string类型的
     
    string s1 = "hello";          // no punctuation
    string s2 = "world"; 
    string s3 = s1 + ", ";       // ok:adding a string and a literal
    string s4 = "hello" + ", "; // error: no string operand
    string s5 = s1 + ", " + "world"  // ok: each + has string operand
    string s6 = "hello" + ", " + s2;  // error:can't add string literals
     
    虽然任何整型数值都可作为索引,但索引的实际数据类型却是unsigned类型string::size_type
     
    cctype头文件
    isalnum(c)   isalpha(c)   iscntrl(c)   isdigit(c)  isgraph(c)不是空格,但可打印  islower(c)  isprint(c) 可打印 ispunct(c)标点   isspace(c)   isupper(c)  isxdigit(c)16进制数  tolower(c)  toupper(c)  
     
    vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。
     
    和string对象一样,标准库将负责管理与存储元素相关的内存。
     
    vector称为容器,因为它可以包含其他对象。
    一个容器中的所有对象都必须是同一种类型的。
     
    vector是一个类模板(class template)不是一种数据类型
    可定义任意多种数据类型  vector<int>和vector<string>都是数据类型
     
    vector<int> ivec;  //该类型含有int类型对象的vector,变量名为ivec
     
     
    vector<int> ivec1;
    vector<int> ivec2(ivec1);
    vector<int> ivec4(10,-1);
    vector<string>svec(10,'hi!');
     
    vector对象的重要属性就在于可以在运行时高效地添加元素。
     
    vector元素连续存储
     
    初始化一个空vector对象,然后再动态地增加元素(更有效相比于对vector对象预先分配内存)
     
    值初始化
    1vector<int> fvec(10);  // 10 elements,each initialized to 0 内置类型  值为0
    2vector<string> svec(10);  // 10 elements,each an empty string 默认构造函数
    3元素类型可能是没有定义任何构造函数的类类型。标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。
     
    v.empty() v.size() v.push_back(t) v[n] v1 = v2 v1==v2
     
    vector<int>::size_type
     
    vector中的对象是没有命名的,可以按vector中对象的位置来访问它们。通常使用下标操作符来获取元素。
     
    c++程序员习惯于优先选用!=而不是<来编写循环判断条件。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。后面会讲到
     
    size()内联函数  
    编译器遇到内联函数时就会直接扩展相应代码,而不是进行实际的函数调用。运行时代价较小
     
     
    缓冲区溢出对不存在的元素进行下标操作的结果
     
    迭代器是一种检查容器内元素并遍历元素的数据类型。
    对所有容器都适用,下标不一定适用所有容器
    vector<int>::iterator iter;
    iter的数据类型是由vector<int>定义的iterator类型
     
    每个容器都定义了一个名为iterator的类型,而这种类型支持(概念上的)迭代器的各种操作。
     
    vector<int>::iterator iter = ivec.begin();
    ivec.end()---->>指向了“末端元素的下一个”    一个不存在的元素 称为超出末端迭代器
     
    如果vector为空,begin返回迭代器与end返回的迭代器相同
     
    由end操作返回的迭代器并不指向vector中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完vector中所有元素
     
    解引用操作符(*操作符)来访问迭代器所指向的元素
    *iter = 0;返回迭代器当前所指向的元素
    若iter指向ivec第一个元素,则*iter = ivec[0]  指向同一个元素 ,值被赋为0。
     
    for(vector<int>::iterator iter = ivec.begin();iter  != ivec.end();++ivec)
         *iter = 0;
     
    const_iterator
    能读不能写
     
    P86。。。。。。。。。。。。。。。。。。。。。
     
    bitset类型
    bitset类型对象的区别仅在其长度而不在其类型。
    bitset<32> bitvec; // 32bits,all zero
     
    只能按位置来访问它们。
     
     
     
     
     
     
     
     
     
     
     
     
    相对于C++内置数据类型的数组和指针而言,程序员应优先使用标准库类类型
  • 相关阅读:
    vue项目 axios封装第二弹
    封装axios
    css基于文件格式使用不同的样式
    vue使用过程中的一些小技巧
    element-ui中单独引入Message组件的问题
    vue中axios复用封装
    OTA“多角恋”:携程闪电入股同程、途牛
    OTA(Online Travel Agent)
    网络时代
    互联网技术
  • 原文地址:https://www.cnblogs.com/wincai/p/4224355.html
Copyright © 2011-2022 走看看