zoukankan      html  css  js  c++  java
  • 2013.05.14_C++primer笔记

    1 为什么头文件只能用于声明,不能用于定义?

             在说明这个问题之前,有三个例外是可以定义在头文件中的:类,值在编译时就已知道的const对象和inline函数。 在头文件中定义这些实体,是因为编译器需要它们的定义来产生代码。
             现在来看看这个问题。

             首先明确的是,如果把定义写在.h文件中,那么很可能出现多重定义的报错。

             每一个点CPP文件都是单独编译的,该点CPP文件中用到的类型必须在它所include 的头文件当中找到,相当于把它所有include的文件中的代码都加到该CPP文件的前面,但是声明的部分将不会出现在编译后的点O文件。这样的结果就是,当有多个文件包含相同的头文件时,并且在该头文件中有定义,那么在多个文件中都会出现相同的定义,而不是声明。所以最后的结果还是多重定义的bug。


    2 标准库vector类型

             vector是同一种类型的对象的集合。

            vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。

    vector<T>  v1; vector保存类型为T的对象。默认构造函数v1为空。
    vector<T> v2(v1); v2是v1的一个副本。
    vector<T> v3(n, i); v3包含n个值为i的元素。
    vector<T> v4(n); v4含有值初始化的元素的n个副本。
            vertor对象的重要属性就在于可以在运行时高效地添加元素
            v.push_back(t):向vector中添加元素到vector的末尾。

            v.size():返回vector中的元素个数,其类型为vector<int>::size_type。该类型必须指出是在哪里定义的,即尖括号中必须指明vector的元素类型。

           for(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)

                  ivec[ix] = 0;

           在此例中,有一个安全的泛型编程的概念。

           必须是已存在的元素才能用下表操作符进行索引。 


    例: 定义vector对象,给定10个元素,每个元素值为42.
           1 vector<int> ivec(10, 42);

           2 vector<int> ivec;

              for (cnt = 1; cnt <= 10; ++cnt)

                   ivec.push_back(42);

         3 vector<int> ivec;

             vector<int>::iterator iter = ivec.end();

             for (int i = 0; i != 10; ++i) {

                    ivec.insert(iter, 42);

                   ivec = ivec.end();

               }


    3 迭代器

            迭代器是一种检查容器内元素并遍历元素的数据类型。

            vector<int> :: iterator iter = ivec.begin();

            由begin返回的迭代器指向第一个元素。

            由end返回的迭代器指向vector的“末端元素的下一个”,通常成为超出末端迭代器。它并不指向vector中的任何实际元素,只是起到一个哨兵的作用,表明我们已经处理完vector中的所有元素。

            如果vector为空,则begin返回的迭代器与end返回的迭代器相同。

            解引用操作符:* ,访问迭代器所指向的元素。

            使用迭代器编写循环

    for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)

            *iter = 0;

            const_iterator:如果我们对const_iterator类型解引用时,则可以得到一个指向const对象的引用,如同任何常量一样,该对象不能进行重写。但是它自身的值可以改变。

            任何改变vector长度操作都会使已存在打得迭代器失效。例如在调用push_back之后,就不能再信赖指向vector的迭代器的值了。

    4 标准库bitset类型

            bitset类型的对象的区别仅在于长度,而不在于类型。
            bitset<32> bitvec(0xffff);  //bit0 ... 15 are set to 1; 16 ... 31 are 0。

            string strval("1100");
            bitset<32> bitvec(strval);

    5 小结

            string类型提供了变长的字符串,而vector类型则可用于管理同一类型的对象集合。

  • 相关阅读:
    sync.WaitGroup golang并发调度器
    Golang New 关键字的小bug 未找到原因(暂时)
    zabbix监控websphere的几个监控项
    zabbix监控AIX DB2数据库
    NOIP2008P 排座椅
    解题报告—— 2018级2016第二学期第五周作业 删数问题
    解题报告——2018级2016第二学期第五周作业排座椅
    解题报告——2018级2016第二学期第四周作业 (2的幂次方)
    解题报告——-2018级2016第二学期第三周作业
    解题报告——2018级2016第二学期第二周作业
  • 原文地址:https://www.cnblogs.com/suzhou/p/3639013.html
Copyright © 2011-2022 走看看