您的位置:首页 > 编程语言 > C语言/C++

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》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: