顺序容器(1):vector

1.容器与顺序容器

  容器:特定类型对象的集合。

  顺序容器:提供 控制 对集合里的 元素 存储和访问 顺序 (这种顺序与元素加入容器时的位置相对应的能力。

    有:vector,deque,list,front_list,array,string 。

      准确的说是:vector 等是一个类模板,本身不是类,应该先指出将其实例化为何种类型(如:vector<int> ivec),下面为了描述简单,将其默认为已经实例化了的类型。

2.顺序容器之迭代器

  下标运算可以访问stirng和vector对象。迭代器 也可以实现这个目的,但是迭代器更为通用,因为所有的标准库容器都支持迭代器。

  怎么声明:举例:vector<int> :: iterator it;

  怎么使用:类似于指针,提供对对象的间接访问。

  *it, it->mem,++it,--it,it1 = it2, it1 != it2;

  注意:"与指针不同的是,获取迭代器使用的不是取地址符,有迭代器的类型 同时 拥有 返回迭代器的成员"  --《c++primer》

    例如:auto a =  v.begin(); auto b = v.end(); 

        v 是有某种迭代器的类型(vector,deque,list,front_list,array,string 有迭代器,int, double 等没有迭代器)。

       begin(), end()是该类型的成员(而且这两个成员函数返回迭代器)。使得a和b能够对对象v进行操作。  

       细节:begin() 和 end () 这对迭代器 对对象 v 的界定是 左闭右开区间,即a 指向 v 的最左端元素的位置, b 指向v 的最右端元素的下一个位置。   

3.vector:是什么,能干什么,怎么干的,优缺点

  vector是类模板vector<T>,可实例化为vector<int>等。

  能比array灵活,是可变大小的array。

  定义和初始化(以int 为例,也可以是double ,string等):

    vector <int> a;

    vector <int> b = a; 或 vector <int> b (a)

    vector <int> c = ( n ,i); // 圆括号表示 提供的值是用来构造 vector 对象的,这里表示c 为 n 个 i 的集合。

    vector <int> c = {......}; // 花括号表示 列表初始化,

  支持的操作:v.empty(), v.size(),v.push_back(), v[n],.......

4. C11 新特性之  for(declaration : expression)   statement 

  expression:一个对象,表示一个序列

  declaration :一个变量,访问序列中的基础元素。每次迭代会被初始化为 expression 部分的下一个元素值。

  注意:

   例子1:

string str("some string");  // 输出str中的每个字符
for (auto c : str)
    cout << c <<endl; 

    得到的输出为:some string 

   例子2:

 1 string word;               // 隔行输出str中的每个字符,,键入 asdf g h jkl;
 2 
 3 vector<string> str;
 4 
 5 while (cin >> word)
 6              str.push_back(word);  
 7 
 8 for (auto c : str)
 9 
10     cout << c <<endl;

    得到的输出为:

       asdf

       g 

       h 

       jkl;

   并没有按预期的隔行输出键入的字符串的每个字符,关键在:declaration :一个变量,访问序列中的基础元素。

   例1 中这个expression 为string ,则其基础元素为单个字符。

   例2 中这个expression 为vector<string>,则其基础元素为string(字符串)。

附:

  vector 能容纳大多数类型的对象作为其元素,(但是 引用 不是对象,所以不存在包含引用的vector。)

  除此之外,绝大多数内置类型和类类型都可以构成vector对象、

  vector<vector<int>> a;  // 向量 a 的元素是 vector 对象。

    在使用  vector<vector<int>> a 时3,不能像二位数组那样用a[i][j]对其进行直接赋值,因为他是个二维向量,其里层为一个容纳int 的vector ,先给vector<int> 赋值后,再给 a(即 vector<vector<int>> a) 进行赋值.

  

vector<vector<int>> a;
vector<int> v;
    for (int i = 0; i<n; i++) { // n 为 向量的维度
        v.clear(); // 每次都要 clear()
        for (int j = 0; j < n; j++)
        {
            cin >> temp;
            v.push_back(temp);
        }
        test.push_back(v);
    }

 

posted @ 2017-09-22 14:01  chli_blog  阅读(323)  评论(0)    收藏  举报