C++学习整理(顺序容器)
2017-05-26 23:12
246 查看
顺序容器
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》
相关文章推荐
- C++学习笔记(2) 顺序容器的使用
- C++primer学习:顺序容器(3)
- C++学习笔记20——顺序容器的操作
- c++顺序容器的学习
- C++学习笔记九-顺序容器(二)
- C++学习笔记之顺序容器
- C++学习笔记19——顺序容器的介绍
- C++学习STL之顺序容器(持续更新)
- C++基础的不能再基础的学习笔记——顺序容器(基本操作)
- 学习C++——顺序容器(1)
- 笔记:C++学习之旅---顺序容器
- C++学习笔记(1) 顺序容器简介
- C++顺序容器学习小结
- C++学习笔记之容器:顺序容器
- C++学习基础四——顺序容器和关联容器
- c++学习6之顺序容器
- 学习C++——顺序容器(2)
- C++基础的不能再基础的学习笔记——顺序容器(其他操作)
- C++学习笔记--顺序容器
- C++学习笔记【第二部分第九章:顺序容器】