以前知识点与容器的联系
以前知识点与容器的联系
这里不介绍具体用法,只是满足个人的需求对容器的探索。
1 循环与容器
如果循环里定义了个数据结构vector,对它进行t次循环,每次都会重新初始化。如:
for(int i=0;i<3;++i)
{
vector<int> a(100);
cout<<a.size()<<' '<<a[0]<<endl;
a.erase(a.begin()+2,a.begin()+20);
a[0]=1;
cout<<a.size()<<' '<<a[0]<<endl;
}
输出结果为
100 0
82 1
100 0
82 1
100 0
82 1
如果没有初始化,则每次循环结束后都会将vector清空,如:
for(int i=0;i<3;++i)
{
vector<int> a;
if(i>=1) cout<<a[0];
a.push_back(1);
cout<<a[0]<<endl;
}
输出中途程序停止工作。
经过测试,对于list,queue,stack,set,map都有以上性质一样。(用调试看)
2 全局变量和局部变量与容器
容器和其他变量一样遵循全局变量与局部变量的规则。
3 容器相关函数的返回值
3.1 count函数的返回值
对于关联容器,函数的返回值为元素k出现的个数。
3.2 erase函数的返回值
- a.erase(begin)或a.erase(begin,end)
如果进行单个元素删除,对于vector,list,set,map,erase,string函数返回值为删除元素所在位置的迭代器,就结果而言,返回一个指向删除元素下一个元素的迭代器。
如果区间删除,erase返回值为删除区间左端点元素所在位置的迭代器。就结果而言,返回一个指向 删除区间右端点元素 的 下一个元素 的迭代器。
请注意,如果迭代器超出容器范围,有可能会运行时出错。 - a.erase(k)
对于map和set,这个函数返回值为是否删除了元素,也就是,如果元素k存在,那么删除k返回1,如果不存在,那么返回0.(个人测试结果) - string类的earse
上面介绍了使用迭代器的,而对于string本身,还有两种删除方法:
s1.erase(1, 3); //删除下标1开始长度为3的子串
s1.erase(5); //删除下标5开始之后所有的字符
返回值都是字符串自身的引用
3.3 find函数的返回值
- 对于关联容器map和set,find函数返回值为查找元素(map是键值)所在位置的迭代器,如果没有,则返回一个指向容器末尾的迭代器(相当于返回a.end())。
- 对于string,find的返回值都是子串或字符在 string 对象字符串中的位置(即下标)。如果查不到,则返回 string::npos。string: :npos 是在 string 类中定义的一个静态常量,它是unsigned int的最大值,强制转化为int后就是-1。(string下的find有很多种类,它们都遵循这些)