这些总结是根据自己的遇到的一些问题或者自己容易忘的一些知识点的总结,可能会有不全面,请大家谅解。
vector
vector是连续内存的容器,它的优点是随机存储很快,但是在中部删除或插入元素很慢。
vector迭代器失效
迭代器失效的情况一般出现在插入或删除操作的时候。
insert失效的时候
insert失效的原因主要是因为vector的capacity发生变化,vector所在的内存不够使用,就会重新开辟一段足够大的内存来存储容器里的元素,当前内存会被重新释放,这样就导致迭代器失效。
int main()
{
vector<int> a;
a.push_back(1);
cout<<a.capacity()<<endl; //输出为1
std::vector<int>::iterator iter = a.begin();
a.push_back(2);
cout<< a.capacity()<<endl; //输出为2
cout << *iter << endl; //出现错误,因为容量发生变量,导致之前的迭代器已经失效
return 0;
}
erase失效的时候
主要是由于erase(iter)之后,iter这个迭代器已经失效,无法再执行++,–的操作。
int main()
{
vector<int> a;
for (int i = 0;i < 10;i++) //a的初始化
a.push_back(i);
for (auto it = a.begin();it != a.end();++it) {
cout << *it << " ";
cout << &(*it) << endl;
}
for (auto it = a.begin();it != a.end();it++) {
if (*it == 3) {
it=a.erase(it);
}
cout << *it << " ";
cout << &(*it) << endl;
}
return 0;
}
从输出结果可以看出,删除3之后,原来3地址为数字4,说明erase(it)之后将迭代器it后面的元素逐个向前移动一个int单位,保证vector在内存上是连续的特性。
string
string 的初始化
string s; //默认构造函数,生成空的字符串s
string s1("hello world!"); //将c字符串作为s1的初始
string s2(s1); //拷贝构造函数
string s3=s2;
string s4(10,'c'); //创建每个元素为‘c’的string的对象,长度为10
//string s(s4,pos,len)
string s5(s4,3,4); //s5是s4从下标3开始4个字符的拷贝,超过s3.size出现未定义,也可以是string s(s4,pos),表示从下标pos到结尾的拷贝
//string s(cp,n)
char cs[]="12345"; //或者写成char *cs="12345";
string s6(cs,3); //复制字符串cs的前3个字符到s当中
string s7(cs,3,2); //赋值字符串cs从下标3开始2个字符。
string s8={'a','b','c'}; //利用列表进行初始化
string s9{'a','b','c'};
string s10(s8.begin(),s8.end());
string 成员函数以及数值转换
string需要注意的知识点
- strlen()等都是C语言的库,如果string要用,必须使用c_str()转换为字符指针
- string可以通过+串联,但是必须保证+至少一边是string对象。
- 字符串指针转换为string类型,可以直接采用直接赋值。
string s;
char *p="hello world!";
s=p;
-string 转char[],可以采用依次赋值,最后需要将char的尾部赋值为‘\0’。