C++学习整理(顺序容器)

顺序容器

1、标准库array具有固定大小

array<int,10>;
array<int,20>;
  • 可以对array数组进行拷贝或赋值操作
int digs[10] = {0,1,2,3,4,5,6,7,8,9};
int cpy[10] = digs; //error,不能对内置数值进行拷贝或赋值
array<int,10> digs1 = {0,1,2,3,4,5,6,7,8,9};
array<int,10> cpy1 = digs1;

2、使用assign(array除外):可以指定元素(的拷贝)替换左边容器的所有元素,如下:

list<string> names;
vector<const char *> oldstyle;
names = oldstyle;//error,容器类型不匹配
names.assign(oldstyle.cbegin(),oldstyle.cend());//ok,可以将const char*类型转换为string

list<sting> slit(1);//1个元素,为空string
slit.assign(10,"Hi");

3、使用swap:可交换两个相同数据结构的内容(除array外,swap不对任何元素进行拷贝、删除或者插入操作,因此可以保证在常数时间内完成)
4、向顺序容器中添加内容

c.insert(p,t)
c.emplace(p,args)
//在迭代器p之前插入元素,并返回新添加元素的迭代器
//insert与emplace的区别:insert需要将对象传递给他们,并对对象进行拷贝;emplace可使参数在容器内直接构造。
//可将元素插入到vector,deque,string的任何位置,但是比较耗时(除头部和尾部)
//迭代器要拷贝的范围不能指向与目的位置相同的容器,运行时会报错
vector<> v;
list<string> l;

l.insert(l.begin(),"hello!");//等价于l.push_front("hello!");

v.insert(v.end(),10,"hello");//在尾部插入10个元素

l.insert(l.begin(),l.end()-2,l.end());//将最后两个元素插入到开始

5、元素访问时,尽量用c.at(n),返回下标为n的引用,越界时会抛出异常。
6、删除元素:(可单独删除一个元素,也可删除迭代器指定的范围)

...
c.erase(p)//删除迭代器p指向的元素,并返回删除元素之后元素的迭代器
c.erase(b,e)//指定范围删除
...
list<string> l;
l.clear();
l.erase(l.begin(),l.end());//等价

7、两个版本删除list中所有的奇数,链表与单链表

//①
list<int> lst = {0,1,2,3,4,5,6,7,8,9};
auto it = lst.begin();
while (it != lst.end()){
    if (*it % 2 == 0)
        it = lst.erase(it);
    else
        ++it;
}
//②
forward_list<int> flst = {0,1,2,3,4,5,6,7,8,9};
auto pre = flst.before_begin();//获取头指针(并不是头节点),没有数据
auto cur = flst.begin();
while (cur != flst.end()){
    if (*cur % 2 == 0)
        cur = flst.erase_after(pre);
    else
        pre = cur;
}

8、改变容器的大小

list<int> l(10,42);//10g个元素,每个位42
l.resize(15);//15个元素,后5个为0
l.resize(20,-1);//在l后添加5个元素,每个位-1
l.resize(5,1);//删除元素,剩下5个

9、vector对象的增长

  • vector和string对象在获取新的空间时,通常会分配比新空间需求更大的空间;
  • 一些成员函数:
c.shrink_to_fit();//将capacity缩减为与size相同大小
   c.capacity();//c的内存空间大小
   c.size();//c含元素的多少
   c.reserve(n);//分配至少能含n个元素的内存空间
   //reserve并不改变容器中元素的数量,只是影响vector中预先分配多大的内存空间,且reverse不能减少内存空间

10、string额外的操作

  • 额外的构造方法:
string s(cp,n);//拷贝cp数组的前n个
     string s(s2,pos2);//从s2的pos2开始拷贝
     string s(s2,pos2,len);
     //如果未传递计数值且数组也未以空字符结尾,或者给定的数值大于数组大小,则构造的结果将是为定义
  • substr(pos,n);
  • append(str),replace(pos,erase_num,str);
  • 搜索操作:(未找到结果,返回string::npos)
////找到name中的第一个数字,返回1
    string numbers("0123456789"),name("r2d2");
    auto pos = name.find_first_of(numbers);
    ////找到name中的第一个非数字字符
    auto pos1 = name.find_first_not_of(numbers);
  • 数值转换:
////
int i = 42;
string s = to_string(i);
double d = stod(s);
////********
string s2 = "pi = 3.14";
d = stod(s2.substr(s2.find_first_of("+-.0123456789")));//d = 3.14 

参考《C++Primer》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值