顺序容器(二)--《C++ primer》



前面已经简单介绍了顺序容器的定义以及一些操作,包括(添加,删除等),下面主要集中以代码的形式简单介绍一下相关用法,首先创建并初始化vector对象,一般有两大类:

1、分配指定数目元素,并初始化(分两种)

         vector<int> ivec(10);

vector<int> ivec(10,1);

2、把vecotr对象初始化为一段元素的副本

int a[10]={1,2,3,4,5,6,7,8,9,10};

vector<int> ivec(a,a+10);

把vector对象初始化为另一对象的副本

         vector<int> ivec1(10,1);

vector<int> ivec2(ivec1);

例如:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    vector<int> kvec(a,a+8);
    //vector<int> ivec(10,1);
    //vector<int> kvec(ivec);
    for(vector<int>::iterator st=kvec.begin();st!=kvec.end();++st)
       cout <<*st <<' ';
    cout << endl;
  return 0;
}

swap(c1,c2)属于赋值运算,交换c1,c2的元素,前提时c1,c2必须具有相同的类型.运用swap赋值通常比c1=c2.swap只是交换两个容器的内部数据结构,其元素本身并没有被交换,这也就意味着指向容器的迭代器,引用和指针在swap操作之后都不会失效.继而在执行swap后,可以通过该容器的迭代器访问交换后元素,如:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
   vector<int> ivec1(10,1);
   vector<int> ivec2(10,2);
   swap(ivec1,ivec2);
   for(vector<int>::iterator kk=ivec1.begin();kk!=ivec1.end();++kk)
      cout << *kk << endl;
   return 0;
}

resize(n)用于改变容器的大小,当将容器扩大时,则超出的部分默认初始化为0,若将容器缩小,则超出的元素将被删除,如:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
   int a[10]={0,1,2,3,4,5,6,7,8,9};
   vector<int> ivec(a,a+10);
   ivec.resize(20);
   //ivec.resize(5);
   for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test)
      cout << *test ;
   cout << endl;

  return 0;
}

关于删除元素操作后迭代器会失效,因此一定要对迭代器重新赋值,更新迭代器。如果删除操作比较频繁,一般选择list。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
   int a[10]={0,1,2,3,4,5,6,7,8,9};
   vector<int> ivec(a,a+10);

   for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test){
      if(*test%2==0){
       test=ivec.erase(test);
       --test;
      }
   }
   for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test){
      cout<< *test <<' ';
   }
   cout << endl;
  return 0;
}

下面是某位仁兄写的,我觉得能更好地说明,所以一并贴出:

#include<iostream>
#include<list>
#include<vector>
#include<deque>
using namespace std; 

void print(list<int>::iterator beg,list<int>::iterator end)
{
     while(beg!=end)
     {
        cout<<*beg<<" ";
        beg++;
     }
     cout<<endl;
} 

void print(vector<int>::iterator beg,vector<int>::iterator end)
{
     while(beg!=end)
     {
        cout<<*beg<<" ";
        beg++;
     }
     cout<<endl;
} 

void deleteelem(list<int>&lst,int flag)
{
     int base=(flag%2==0?0:1);
     list<int>::iterator head=lst.begin(),tail=lst.end();
     while(head!=tail)
     //这里不用更新指向容器尾端的迭代器
     //因为list容器删除元素后没有出现元素的移动
     {
               if(*head%2==base)
                   head=lst.erase(head);
               //巧妙利用函数返回值
               else
                   head++;
     }
} 

void deleteelem(vector<int>&vec,int flag)
{
     int base=(flag%2==0?0:1);
     vector<int>::iterator head=vec.begin(),tail=vec.end();
     while(head!=(tail=vec.end()))
     //这里要更新一下指向容器尾端的迭代器
     //因为vector容器删除元素后元素要顺序前移是迭代器失效
     {
               if(*head%2==base)
                   head=vec.erase(head);
               else
                   head++;
     }
} 

int main()
{
    int ia[10]={0,1,2,3,4,5,6,7,8,9};
    list<int>odd(ia,ia+10);
    vector<int>even(ia,ia+10);
    print(odd.begin(),odd.end());
    print(even.begin(),even.end());
    deleteelem(odd,2);
    print(odd.begin(),odd.end());
    deleteelem(even,1);
    print(even.begin(),even.end()); 

    return 0;
} 
时间: 2024-10-13 11:43:30

顺序容器(二)--《C++ primer》的相关文章

C++primer(第五版)第九章 顺序容器(容器的运用及其部分习题解答,C++11特性总结,重点章节内容较多)

顺序容器:为程序员提供了控制元素存储和访问顺序的能力.(无序容器)           1.顺序容器的概述           A.顺序容器的类型           vector:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢.          deque:双端队列.支持快速随机访问.在头尾位置插入/删除速度很快.           list:双向链表.只支持双向顺序访问.在list中任何位置进行插入/删除操作速度都很快.          forword_list

0716-----C++Primer听课笔记----------STL之顺序容器、迭代器

1. 顺序容器的初始化操作 1.1 顺序容器(vector,list,deque)的五种初始化方法,以 vector 为例. #include <iostream> #include <string> #include <vector> using namespace std; int main(int argc, const char *argv[]) { //1.定义空数组 然后后面追加 vector<string> vec1; vec1.push_ba

C++ Primer 第九章顺序容器

一.综述 <vector>:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢. <deque>:双端队列.支持快速随机访问.在头尾位置插入/删除速度很快. <list>:双向链表.只支持双向顺序访问.在list中任何位置进行插入/删除操作速度都很快. <forward_list>:单向链表.只支持单向顺序访问.在链表任何位置进行插入/删除操作速度都很快. <array>:固定大小数组.支持快速随机访问.不能添加或删除元素.

C++ Primer 第四版读书笔记(八)之顺序容器

容器容纳特定类型对象的集合. 标准库vector类型,是一个顺序容器.它将单一类型元素聚集起来称为容器,然后根据位置来存储和访问这些元素,这就是顺序容器.顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定. 标准库定义了三种顺序容器类型:vector.list和deque.它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价.标准库还提供了三种容器适配器.实际上,适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型. 顺序容器类型 顺

【足迹C++primer】26、顺序容器操作

顺序容器操作 向顺序容器添加元素 forward_list //有自己专有版本的insert和emplace: forward_list //不支持push_back和emplace_back vector, string //不支持push_front和emplace_front c.push_back(t), c.emplace_back(args) //在c的尾部创建一个值为t的或者由args创建的元素,返回void c.push_front(t), c.emplace_back(args

C++ Primer笔记5_STL之顺序容器

1.STL(Standard Template Library) 标准模板库.从根本上说,STL是一些"容器"的集合,这些"容器"有list, vector,set,map等,STL也是算法和其它一些组件的集合.这里的"容器"和算法的集合指的是世界上很多聪明人很多年的杰作.每一个C++程序员都应该好好学习STL.大体上包括container(容器).algorithm(算法)和iterator(迭代器),容器和算法通过迭代器可以进行无缝连接. 2

C++ Primer 第四版读书笔记(八)之顺序容器(续)

3.6 访问元素 如果容器非空,那么容器类型的front和back成员将返回容器内第一个或最后一个元素的引用. 访问顺序容器内元素的操作 c.back() 返回容器c的最后一个元素的引用.如果c为空,则该操作未定义 c.front() 返回容器c的第一个元素的引用.如果c为空,则该操作未定义 c[n] 返回下标为n的元素的引用 如果n<0或n>c.size(),则该操作未定义 只适用于vector和deque容器 c.at[n] 返回下标为n的元素的引用.如果下标越界,则该操作未定义 只适用于

c++ primer 9 顺序容器

定义: 1 #include <vector> 2 #include <list> 3 #include <deque> 4 5 vector<int> svec; 6 list<int> ilist; 7 deque<int> items; 初始化: 1. 将一个容器初始化为另一个容器的副本 容器类型,元素类型必须相同 1 vector<int> a; 2 vector<double> d(a); 3 4 l

C++ primer笔记——第九章 顺序容器

顺序容器的元素按照其位置存储和访问.除了顺序容器之外,标准库还提供了几种关联容器,其元素按照键(key)排序.每组容器都提供一组不同的时间和功能的折中方案.顺序容器根据位置来存储和访问元素,元素的排列次序与元素值无关,而是由元素添加到容器的顺序决定.标准库定义了三种顺序容器:vector.list.dequeue.他们的差别在于元素访问的方式以及添加和删除元素相关操作的运行代价.标准库还提供了三种适配器.适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口来适应基础的容器类型.顺序容器适