Chinaunix首页 | 论坛 | 博客
  • 博客访问: 518040
  • 博文数量: 96
  • 博客积分: 2102
  • 博客等级: 上尉
  • 技术积分: 1695
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:12
文章分类

全部博文(96)

文章存档

2014年(2)

2012年(94)

分类: C/C++

2012-05-20 16:03:37

    一、名词定义
  •  Vector:是一种类型的对象的集合,每个对象都有一个对应的整数索引值。它又称为容器,因为他可以包含其他对象。而在一个容器中对象的类型必须是一致的。在使用Vector之前必须包含相关头文件。#include using std::vector;vector是一个类模板。
  • 迭代器:除了根据下标访问对容器中的对象进行访问之外,还可以通过迭代器进行访问。标准库为每一种标准容器(eg:Vector)定义了一种迭代器类型。
  • 数组:C++语言提供了类似与Vector的低级复合类型--------数组;它也是一种存储单一数据类型对象的容器,其中每一个对象都没有单独的名字,而是通过它在数组中的位置通过下标进行访问。
  • 指针:C++语言提供了类似与迭代器的低级复合类型---------指针;指针用于指向对象,与迭代器一样,指针提供对其所指对象的间接访问,只是指针更加通用一些。与迭代器不同的是,指针指向单个对象,而迭代器只能用于访问容器内部的元素。

二、定义及初始化

  •    定义一个Vector 需要指定类型和一个变量的列表。是可以动态增长的。
    1. vector v1 ; vector保存类型为T的对象,构造函数默认为空;
    2. vector v2(v1) ; v2是v1的副本
    3. vector v3(n,i) ;v3包含n个值为i的元素
    4. vector v4(n) ;v4含有值初始化的元素的n个副本
    如果没有指定元素的初始化,那么标准库将自行提供一个元素的初值进行值的初始化。这个由库生成的初始之将用来初始化容器中的每一个元素。例如vetcorok(10) ------------10 elements.each initialized to 0;如果vetcor含有的是构造函数的类型元素,标准库将用该类型的默认构造函数创建元素的初始化。
  • 每种容器类型都定了他自己的迭代器类型,如vector:vector :: iterator iter;每个标准库容器类型都定义了一个名为iterator的成员,这里的iterator与迭代器实际类型的含义相同;每个容器都定义了命名为begin和end的函数,用于返回迭代器。如果使用的是begin()则返回的迭代器指向第一个元素,反之指向最后一个;迭代器类型定义一些操作来获取迭代器所指向的元素,并且允许迭代器从一个元素到另一个元素(自增自减操作符)。在迭代器中可以使用解引用操作符(*操作符)来访问迭代器所指向的元素。
  • 数组的位数必须用值大于等于1的常量表达式定义。此常量表达式只能包含三整型面值、枚举常量或者常量表达式初始化的整型const对象。数组的维数必须要在一对[]进行指定。
    1. 1、显示初始化数组元素
    2. 在定义数组时,可为其元素提供一组逗号分隔的初值,这些初值用花括号{}扩起来,称为初始化列表
    3. const unsigned array_size=3
    4. int array[array_size]={0,1,2};
    5. 如果没有显示提供元素的初值,则数组会象普通变量一样初始化
    6. :在函数体外定义的内置数组,其元素初值为0;
    7. :在函数体内定义的内置数组,其元素无初始化;
    8. :不关数组定义在哪里,如果类型为类类型,则自动调用该类的默认构造函数进行初始化;如果没有默认构造函数,则必须为该数组的元素提供显示初始化。
    9. 2、特殊的字符数组
    10. 字符数组可以用一组花括号扩起来、逗号隔开的字符字面值进行初始化;也可以用一个字符串字面值进行初始化。但是对于后者来讲惠自动添加一个null作为结束符号,因此要对于数组大小多申请一个元素。
    11. 3、不允许数组直接复制和赋值
    12. eg:
    13. int ia[]={1,2,3};
    14. int ia2[](ia) ;/*error*/
    15. int main()
    16. {
    17. const usigned array_size = 3;
    18. int array[array_size];
    19. ia3=ia;/*error*/
    20. return 0;
    21. }
  • 声明/定义格式: 类型   *变量名  / 类型*     变量名。 指针可能取到的值:保存一个特定对象的地址;指向某一个对象后面的另一对象;或者是0值;批注:void * 类型的指针可以保存任何类型对象的地址。

三、操作及代码

  • vector :vector标准库提供了许多类似string对象的操作。

    vectorv ;

    1. v.empty() ;如果v为空则返回true,否则返回false
    2. v.size() ;返回v中元素的个数
    3. v.push_back(t) ;在v的末尾添加一个值为t的元素
    4. v[n] ;返回v中位置为n的元素
    5. v1=v2 ;把v1的元素替换为v2的中元素的副本
    6. v1==v2;如果v1与v2相等,则返回true
    7. !=,<,<=,>=,> 保持这些操作符惯有的含义
    批注:对于C++中遍历元素的循环语句中的判断条件是:i!=v.size() 原因是对于容器而言是随时并且动态的增长的,因此不会用一个变量unsigned int n=v.size(),i!=n来取代上面的代码。对于容器而言,通过索引只能访问元素不能添加值。并且只能对于确知已存在的元素进行下标操作。对于下标的类型是vectot::size_type index

    点击(此处)折叠或打开

    1. #include<iostream>
    2. #include<vector>
    3. #include<string>
    4. using std::string;
    5. using std::cin;
    6. using std::cout;
    7. using std::endl;
    8. using std::vector;

    9. int main()
    10. {
    11.     string word;
    12.     unsigned int n=0;
    13.     vector<string> text;
    14.     vector<string> text1(3,"jkjk ");
    15.     vector<string> text2(text1);


    16.     if(text.empty())
    17.         cout <<"empty" << endl;
    18.     else
    19.        cout <<"not empty "<<endl;

    20.     if(text1==text)
    21.         cout<<"text1 equal to text "<<endl; 
    22.         cout<<"text1 " <<<endl;
    23.     else
    24.         cout<<"text1 equal to text "<<endl;

    25.     if(text1==text2)
    26.         cout<<"text1 equal to text2 " <<endl;
    27.     else
    28.         cout<<"text1 not equal to text2 " <<endl;
    29.     cout<<"the text2 : "<<endl;
    30.     for(int i=0;i!=text2.size();i++)
    31.         cout<<text2[i]<<" ";
    32.     cout<<endl;

    33.     while(n++<5)
    34.     {
    35.         cin>>word;
    36.         text.push_back(word);
    37.     }
    38.     cout<<endl;
    39.     for(int i=0;i!=text.size();i++)
    40.         cout<<text[i]<<" ";
    41.     cout<<endl;

    42.     return 0;
    43. }
    开始时,编程使用的是26行的加粗形式进行的编码,但是出现编译错误。----得出:对于容器是无法用cout进行输出的只能对其中某一个对象进行操作。如图:  运行结果如图:
  • 迭代器:用==或者!= 对两个迭代器进行比较,如果两个迭代器指向同一个元素,则相同。类型为vectot::iterator

    点击(此处)折叠或打开

    1. #include<iostream>
    2. #include<string>
    3. #include<vector>
    4. using std::cin;
    5. using std::cout;
    6. using std::endl;
    7. using std::string;
    8. using std::vector;

    9. int main()
    10. {
    11.     vector<int> num(5,3);
    12.     cout<<"index show :"<<endl;
    13.     for(vector<int>::size_type i=0;i<num.size();i++)
    14.         cout<<" " << num[i];
    15.         cout<<endl;
    16.     int i=0;
    17.     for(vector<int>::iterator iter=num.begin();iter!=num.end();iter++ )
    18.             *iter=i++;
    19.     for(vector<int>::iterator iter=num.end()-1;iter>=num.begin();iter-- )
    20.         cout<<" "<<*iter;
    21.         cout<<endl;
    22.         return 0;
    23. }
    批注:对于迭代器的类型还可以是const_iterator;类型的,则vector元素中的值将无法改变。对于const vector iterator 是不同的,对于后者定义时是需要初始化的,初始化后就无法修改。运行结果
  • 对于数组的操作主要是经过下标来实现的,其类型为size_t。

    点击(此处)折叠或打开

    1. #include<iostream>
    2. int main()
    3. {
    4.     char st[11]="fundamenal";
    5.     char st[11]="fundamenaly";/*出现越界错误*/
    6.     for(size_t i=0;i<11;i++)
    7.         std::cout<<st[i] << " ";
    8.         std::cout<<std::endl;
    9.     
    10.     for(size_t i=0;i<11;i++)
    11.         std::cin>>st[i];
    12.         std::cout<<std::endl;
    13.         return 0;
    14. }
  • 指针:提供了间接操作其所指对象的功能。指针是数组的迭代器。
    1. 1、生成左值的解引用操作
    2. *sp = "goodbye"
    3. string s1="some value"
    4. sp = &s1;
    5. 2、指针和引用的比较
    6. 引用总是指向某个对象,定义时未初始化的引用是错误的;赋值行为的差异,给引用赋值修改的是 该引用锁关联的对象的值,而不是使引用与另一个对象的关联。引用一经初始化就始终指向同一个特定对象。
    7. int val1=1024,ival=2048;
    8. int *p1 = &val1,*pi2=&ival;
    9. p1 = p2;
    10. p1所指的对象值不变,但是赋值操作将p1的指向修改了。
    11. int &r1=ival,&r2=ival2;
    12. r1=r2;
    13. 赋值语句将r1引用ival的值而不是r1的值。赋值后,这两个引用还是指向原来关联的对象,此时两个对象的值相等。
    14. 3、指向指针的指针:int *p=&val1;int **p1 = &p;

  四、指针和const限定符

        1、指向const对象的指针: 不允许用指针来修改其值;const 类型 * 变量名,const 限定的是该指针指向对象而不是指针本身,因此该指针变量不是必须初始化,如果需要的化可以修改他的值。

        eg : const int * ptr ; *ptr = 54; /*error ,*ptr must be const/

                const int ok=8; const int * ptr = &ok;

        批注:  :把一个const对象的地址赋值给一个普通的、非const对象的指针会导致编辑错误

                      :不能使用void *指针保存const对象的地址,而必须使用const void *指针保存。

                      :允许将非const对象的地址赋值给指向const对象的指针。不能使用指向const对象的指着修改基础需对象,然额如果该指针指向一个非const对象,可用其他方法修改其所指对象的值。

       2、const 指针--------本身不能修改;const指针在定义时必须初始化;类型 const * 变量名。

       3、指向const对象的const指针----------本身和指向的对象都无法修改。const 类型 const * 变量名

       4、指针和typedef

          typedef stringp *string ;

          const stringp cstr;

         其中stringp虽然是一个string 类型的指针,但是对于const的修饰来讲并不等价于

        const string * cstr ;因为在typedf后stringp已经是一个整体,所以cstr定义为指向string类型对象的const指针,这个定义等价于string * const cstr;

阅读(6765) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~