C++中容易忘记的知识点——vector和string(三)

    这些总结是根据自己的遇到的一些问题或者自己容易忘的一些知识点的总结,可能会有不全面,请大家谅解。


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’。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值