美文网首页
(十一)C++篇-容器list,deque,vector

(十一)C++篇-容器list,deque,vector

作者: GoodTekken | 来源:发表于2022-06-20 15:26 被阅读0次
    1,容器的使用

    调用 push_back 函数会在容器 container 尾部创建一个新元素,并使容器的长度加 1。新元素的值为 text_word 对象的副本,而 container 的类型则可能是 listvectordeque
    除了 push_back 运算,listdeque 容器类型还提供了类似的操作:push_front。这个操作实现在容器首部插入新元素的功能。
    测试代码如下:

    #include <iostream>
    #include <list>
    #include <deque>
    #include <vector>
    using namespace std;
    
    int main()
    {
        list<int> ilist;
        // add elements at the end of ilist
        for (size_t ix = 0; ix != 4; ++ix)
        ilist.push_back(ix);
    
        // add elements to the start of ilist
        for (size_t ix = 0; ix != 4; ++ix)
        ilist.push_front(ix);
        
        for(list<int>::iterator iter = ilist.begin();iter!=ilist.end();iter++)
        {
            cout<<*iter<<" ";
        }
        cout<<endl;
        return 0;
    }
    

    输出结果:

    tekken@tekken:~/C++WS$ ./a.out 
    3 2 1 0 0 1 2 3 
    
    函数 定义
    c.push_back(t) 在容器 c 的尾部添加值为 t 的元素。返回 void 类型
    c.push_front(t) 在容器 c 的前端添加值为 t 的元素。返回 void 类型只适用于 list 和 deque 容器类型.
    c.insert(p,t) 在迭代器 p 所指向的元素前面插入值为 t 的新元素。返回指向新添加元素的迭代器
    c.insert(p,n,t) 在迭代器 p 所指向的元素前面插入 n 个值为 t 的新元素。返回 void 类型
    c.insert(p,b,e) 在迭代器 p 所指向的元素前面插入由迭代器 b 和 e 标记的范围内的元素。返回 void 类型
    2,容器大小的操作。
    函数 定义
    c.size() 返回容器 c 中的元素个数。返回类型为c::size_type
    c.max_size() 返回容器 c 可容纳的最多元素个数,返回类型为c::size_type
    c.empty() 返回标记容器大小是否为 0 的布尔值
    c.resize(n) 调整容器 c 的长度大小,使其能容纳 n 个元素,如果 n <c.size(),则删除多出来的元素;否则,添加采用值初始化的新元素
    c.resize(n,t) 调整容器 c 的长度大小,使其能容纳 n 个元素。所有新添加的元素值都为 t

    容器类型提供 resize 操作来改变容器所包含的元素个数。如果当前的容器长度大于新的长度值,则该容器后部的元素会被删除;如果当前的容器长度小于新的长度值,则系统会在该容器后部添加新元素:

    list<int> ilist(10, 42); // 10 ints: each has value 42
    ilist.resize(15); // adds 5 elements of value 0 to back of ilist
    ilist.resize(25, -1); // adds 10 elements of value -1 to back of ilist
    ilist.resize(5); // erases 20 elements from the back of ilist
    

    resize 操作可能会使迭代器失效。在 vector 或 deque 容器上做 resize 操作有可能会使其所有的迭代器都失效。
    对于所有的容器类型,如果 resize 操作压缩了容器,则指向已删除的元素迭代器失效。

    3,访问元素

    如果容器非空,那么容器类型的 front 和 back 成员将返回容器内第一个或最后一个元素的引用:

    // check that there are elements before dereferencing an iterator
    // or calling front or back
    if (!ilist.empty()) 
    {
    // val and val2 refer to the same element
    list<int>::reference val = *ilist.begin();
    list<int>::reference val2 = ilist.front();
    // last and last2 refer to the same element
    list<int>::reference last = *--ilist.end();
    list<int>::reference last2 = ilist.back(); 
    }
    

    这段程序使用了两种不同的方法获取时 ilist 中的第一个和最后一个元素的引用。 直接的方法是调用 front 或 back 函数。 间接的方法是, 通过对 begin操作返回的迭代器进行解引用,或对 end 操作返回的迭代器的前一个元素位置进行解引用,来获取对同一元素的引用。在这段程序中,有两个地方值得注意:
    end 迭代器指向容器的超出末端的下一位置,因此必须先对其减 1 才能获取最后一个元素;另一点是,在调用 front 或 back 函数之前,或者在对 begin 或 end 返回的迭代器进行解引用运算之前,必须保证 ilist 容器非空。如果该list 容器为空,则 if 语句内所有的操作都没有定义。

    函数 定义
    c.back() 返回容器 c 的最后一个元素的引用。如果 c 为空,则该操作未定义
    c.front() 返回容器 c 的第一个元素的引用。如果 c 为空,则该操作未定义
    c[n] 返回下标为 n 的元素的引用,如果 n <0 或 n >= c.size(),则该操作未定义,只适用于 vectordeque 容器
    c.at(n) 返回下标为 n 的元素的引用。如果下标越界,则该操作未定义只适用于 vector 和 deque 容器
    4,删除元素
    函数 定义
    c.erase(p) 删除迭代器 p 所指向的元素。返回一个迭代器,它指向被删除元素后面的元素。如果 p 指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果 p 本身就是指向超出末端的下一位置的迭代器,则该函数未定义
    c.erase(b,e) 删除迭代器 b 和 e 所标记的范围内所有的元素。返回一个迭代器,它指向被删除元素段后面的元素。如果 e 本身就是指向超出末端的下一位置的迭代器,则返回的迭代器也指向容器的超出末端的下一位置
    c.clear() 删除容器 c 内的所有元素。返回 void
    c.pop_back() 删除容器 c 的最后一个元素。返回 void。如果 c 为空容器,则该函数未定义
    c.pop_front() 删除容器 c 的第一个元素。返回 void。如果 c 为空容器,则该函数未定义。只适用于 list 或 deque 容器
    5,删除容器内所有元素

    要删除容器内所有的元素,可以调用 clear 函数,或将 begin 和 end 迭代器传递给 erase 函数。
    slist.clear(); // delete all the elements within the container
    slist.erase(slist.begin(), slist.end()); // equivalent

    相关文章

      网友评论

          本文标题:(十一)C++篇-容器list,deque,vector

          本文链接:https://www.haomeiwen.com/subject/ttrjvrtx.html