`
20386053
  • 浏览: 434706 次
文章分类
社区版块
存档分类
最新评论

容器的多重嵌套

阅读更多
//在刚学结构链表的时候,我就想,应该能把几个链表的首指针放在 一个指针数组里。而这个指针数组

//则又是另一个链表的某个元素。学习完容器之后,发现,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!





总结经验,无论多么深的容器嵌套,只用把它和外面一层的勾通做好,就一切大吉了! 

分享到:
评论

相关推荐

    Spring基础.pdf

    多重对象嵌套,IoC容器就可以有效地帮我们去避免在程序中编写复杂的初始化逻辑,使开发 更便捷。 • IoC叫做控制反转,也就是我们失去了对于对象的创建权利的控制,IoC容器帮我们维护了所有 项⽬中对象的⽣命周期...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     9.3.6 容器操作可能使迭代器失效 315  9.4 vector对象是如何增长的 317  9.5 额外的string操作 320  9.5.1 构造string的其他方法 321  9.5.2 改变string的其他方法 322  9.5.3 string搜索操作 325  9.5.4 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    17.2.2 嵌套命名空间 603 17.2.3 未命名的命名空间 604 17.2.4 命名空间成员的使用 606 17.2.5 类、命名空间和作用域 609 17.2.6 重载与命名空间 612 17.2.7 命名空间与模板 614 17.3 多重继承与虚继承 614 17.3.1 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     9.3.6 容器操作可能使迭代器失效 315  9.4 vector对象是如何增长的 317  9.5 额外的string操作 320  9.5.1 构造string的其他方法 321  9.5.2 改变string的其他方法 322  9.5.3 string搜索操作 325  9.5.4 ...

    StimulSoft_Reports.Net_2009.1.359破解+2009.1.400试用版_Part1

    在报表中允许分组之间的多重嵌套。一个报表中的分组无任何的数量限制。 (6) 图表 本产品拥有广泛的图表集合,它们被设计用来增加报表的图形化效果。本产品支持如下的图表类型:簇状柱形图(Clustered Column)、簇状...

    StimulSoft_Reports.Net_2009.1.359破解+2009.1.400试用版_Part2

    在报表中允许分组之间的多重嵌套。一个报表中的分组无任何的数量限制。 (6) 图表 本产品拥有广泛的图表集合,它们被设计用来增加报表的图形化效果。本产品支持如下的图表类型:簇状柱形图(Clustered Column)、簇状...

    C++大学教程,一本适合初学者的入门教材(part2)

    2.10 构造算法与自上而下逐步完善:实例研究3(嵌套控制结构) 2.11 赋值运算符 2.12 自增和自减运算符 2.13 计数器控制循环的要点 2.14 for重复结构 2.15 for结构使用举例 2.16 switch多项选择结构 2.17 do/...

    C++大学教程,一本适合初学者的入门教材(part1)

    2.10 构造算法与自上而下逐步完善:实例研究3(嵌套控制结构) 2.11 赋值运算符 2.12 自增和自减运算符 2.13 计数器控制循环的要点 2.14 for重复结构 2.15 for结构使用举例 2.16 switch多项选择结构 2.17 do/...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    18.1.3 多重抛出和捕获 543 18.1.4 在函数中抛出异常 546 18.1.5 异常说明 547 18.2 异常处理的编程技术 549 18.2.1 抛出异常的时机 549 18.2.2 异常类的层次结构 552 18.2.3 测试可用内存 552 18.2.4 再次...

    ZMathCode:记录下刷题的一些代码

    合并两个有序多重 20210203双指针:11。盛最多水的容器双指针:26。删除排序数组中的重复项双指针:283。移动零 20210202排序:面试题17.15。最长单词等级:524。通过删除字母匹配到字典里最长单词 20210129排序:75...

    C++编程思想习题

    2.10嵌套结构 2.11小结 2.12练习 第3章 隐藏实现 3.1设置限制 3.2C++的存取控制 3.3友元 3.3.1嵌套友元 3.3.2它是纯的吗 3.4对象布局 3.5类 3.5.1用存取控制来修改stash 3.5.2用存取控制来修改stack 3.6句柄类...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    3.1.3 嵌套的if-else语句 107 3.1.4 逻辑运算符和表达式 109 3.1.5 条件运算符 112 3.1.6 switch语句 113 3.1.7 无条件转移 116 3.2 重复执行语句块 117 3.2.1 循环的概念 117 3.2.2 for循环的变体 119 ...

    力学数据库系统.doc

    教学目标 本课程的教学目标是使学生在学习本课程后能利用FoxPro建立力学相关信息数据库, 执行查询,生成报表以及多重文件的操作,初步掌握FoxPro的程序设计方法及FoxPro应 用程序所必需的技术。 2. 基本要求 本...

    后台首选布局技术,Frameset绝对经典 精简 清晰布局

    唯 COLS 与 ROWS 两参数尽量不要同在一个 &lt;FRAMESET&gt; 标记中,因 Netacape 偶然不能显示这类形的框架,尽量采用多重分割。 &lt;FRAME&gt; 参数设定: 例子: name="top" 设定这个框窗的名称,这样才能指定框架来作连结,...

    從新手到高手C++全方位學習

    16.4 多重繼承中初始化構造函數的參數 16.5 多個子基類共享一個父基類 16.6 虛基類 16.7 慎用多重繼承 16.8 空的虛函數 16.9 抽像類和純虛函數 16.10 純虛函數 16.11 複雜的抽象結構 第17章 類的特殊成員 17.1 靜態...

    千方百计笔试题大全

    16、在JAVA 中,如何跳出当前的多重嵌套循环? 9 17、构造器Constructor 是否可被override? 9 18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 ...

    java面试宝典

    16、在JAVA 中,如何跳出当前的多重嵌套循环? 9 17、构造器Constructor 是否可被override? 9 18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 ...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    java基础题 很全面

    63. 在JAVA中,如何跳出当前的多重嵌套循环? 14 64. List、Map、Set三个接口,存取元素时,各有什么特点? 14 65. UML方面 14 66. 说出一些常用的类,包,接口,请各举5个 14 67. 开发中都用到了那些设计模式?用在什么场合?...

Global site tag (gtag.js) - Google Analytics