容器的多重嵌套

来源:互联网 发布:ubuntu 16.04国内镜像 编辑:程序博客网 时间:2024/04/30 07:29
//在刚学结构链表的时候,我就想,应该能把几个链表的首指针放在 一个指针数组里。而这个指针数组//则又是另一个链表的某个元素。学习完容器之后,发现,C++的容器更容易实现这样的操作。//可是,当我把含有容器的对象,放进另一个容器的时候,问题出现了。我不知道应该怎么来访问最里//面 容器的元素。这是我逻辑上的一个误区。 今天解决了,按照老师的指点,彻底明白了问题的关键我们先要考虑的是,如果把外面的容器扔掉,怎么来访问这个对象的容器元素。首先发现,这个容器里的对象,不是外部可以访问的,必须在类的定义里,给我加一个成员函数来操作这个容器,好了,我们先写一个带有容器的类。然后再写一个可以对容器进行操作的函数 class temp{      protected:                                vector <int> subject;      //声明vector容器       public:                             int vec_return(int);       //操作容器,返回某位置的值。int 为要访问的元素位置 };int temp::vec_return (int a)                           //这是函数的实现, {                             if ((a <subject.size())&&(a >= 0))      //判断参数是否合理                             {                       return subject[a];                 }                 else                 {                     cout << "参数不合理"<<endl;                 }return -1;}好了,我们现在完全可以在外面用vec_return函数来访问类里的vector中的元素;现在我们把最外面的容器加上。vector <temp> name_sub;vector可以用下标来访问元素,这个容器这个特点现在占了优势,让我们可以更容易的完成对其中的元素访问 。如果我们要访问,name_sub[4]第5个元素。这就是这个元素了,这个元素中的容器怎么访问呢 是 这样的name_sub[4].vec_return(5);。。。这好使吗。。我们来试试  #include <iostream>#include <vector>using namespace std;class temp{      protected:                                vector <int> subject;      public:                             int  vec_return(int);       //操作容器,返回某位置的值。int 为要访问的元素位置                                 temp ()                     //构造函数                 {                                                               for (int i=0;  i<9;   i++)                     {                         subject.push_back(i);                     }                                     }                                                              };int temp::vec_return (int a)                           //这是函数的实现, {                             if ((a <subject.size())&&(a >= 0))      //判断参数是否合理                             {                       return subject[a];                 }                 else                 {                     cout << "参数不合理"<<endl;                 }return -1;}int main(){    vector <temp>  name_sub(10);        cout << name_sub[4].vec_return(5)<<endl;        cin.get();        return 0;}哈,运行成功!!^_^顺序容器这么访问真方便,加一点点难度,用list再练习练习,我们把里面和外面的容器全搞成list的  我们先写一个带有list容器的类class temp{      protected:                                list <int> subject;      //声明list容器       public:                             temp ()                     //构造函数                 {                                                               for (int i=0;  i<9;   i++)                     {                         subject.push_back(i);                     }                                     }                                                 ~temp(){}                                int  list_return(int);    //操作容器,返回某位置的值。int                                         // 为要访问的元素位置 };int  list_return(int a)                   //函数的实现                                          //这里有点问题,list容器,不能直接用下标访问                                          //所以,我们先建一个迭代,然后控制迭代访问 {      list <int>::iterator itr=subject.begin();                                              if ((a <subject.size()) && (a >= 0))      //判断参数是否合理       {         for (int i=0;  i!=a;  ++i)          //参数合理,就把迭代指向所需元素;          {             itr++;         }      }      else                                   // 不合理退出       {          cout << "参数错误"<<endl;          return -1;      }return *itr;                                 //返回所需要元素值; }现在完成了在类外面怎么访问这个list容器。现在应该是给这个类外面再套一个容器的时候了。list <temp>  name_subject;唉,list不支持下标访问。因为不是顺序容器。。我们必须给它建一个迭代器来访问它list <temp>::iterator itr=name_subject.begin();然后对这个迭代指向的元素进行操作;itr->list_return(6) 哈哈!代码好像比vector漂亮;试一试的时间到了!!! #include <iostream>#include <list>using namespace std;class temp{      protected:                                list <int> subject;      //声明list容器       public:                             temp ()                     //构造函数                 {                                                               for (int i=0;  i<9;   i++)                     {                         subject.push_back(i);                     }                                     }                                                 ~temp(){}                                int  list_return(int);    //操作容器,返回某位置的值。int                                         // 为要访问的元素位置 };int  temp::list_return (int a)            //函数的实现                                          //这里有点问题,list容器,不能直接用下标访问                                          //所以,我们先建一个迭代,然后控制迭代访问 {      list <int>::iterator itr=subject.begin();                                              if (a <subject.size() && a >= 0)       //判断参数是否合理       {         for (int i=0;  i!=a;  ++i)          //参数合理,就把迭代指向所需元素;          {             itr++;         }      }      else                                   // 不合理退出       {          cout << "参数错误"<<endl;          return -1;      }      return *itr;                                 //返回所需要元素值; }int output (list <temp> &name_sub,  int a,  int b)   //为了方便,我建了一个函数来操作整个返回过程                                                     //name_sub为所要访问的容器引用                                                      //int a为外层容器位置, int b为内层容器位置{      list <temp>::iterator itr=name_sub.begin();    //建迭代准备访问;                if (a <name_sub.size() && a >= 0)              //判断参数是否合理       {                              for (int i=0;  i!=a;  ++i)                  //参数合理,就把迭代指向所需元素;          {             itr++;         }      }      else                                           // 不合理退出       {          cout << "参数错误"<<endl;          return -1;      }      return itr->list_return(b);}int main(){    list <temp> name_sub(10);            cout << output(name_sub, 6,  4)<<endl;        cin.get();return 0;}运行成功!!happy!总结经验,无论多么深的容器嵌套,只用把它和外面一层的勾通做好,就一切大吉了! 
原创粉丝点击