//在刚学结构链表的时候,我就想,应该能把几个链表的首指针放在 一个指针数组里。而这个指针数组
//则又是另一个链表的某个元素。学习完容器之后,发现,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!
总结经验,无论多么深的容器嵌套,只用把它和外面一层的勾通做好,就一切大吉了!
容器 扩容 缩容 扩容装置
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章