Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1848218
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2021-02-16 16:47:55

  • remove(): remove函数只管移除指定元素,位于指定元素后面的数据是直接copy到被移除的位置的,如:6 5 4 3 2 1 1 2 3 4 5 6 remove 3之后,就是  6 5 4 2 1 1 2 4 5 6 5 6 同时,begin()和end()所指均未改变,只能将remove()返回的iterator记录下来,进行resize, erase之类的操作或者调用容器本身的成员函数来进行操作,另外,unique()也是一个德行,谨记谨记
  • array<>调用其swap的时候,是线性复杂度,其置换之后,iterator和reference指向原来容器,但指向不同元素,如下代码:

点击(此处)折叠或打开

  1.     array<int, 5> a({1,2,3});
  2.     array<int, 5> b({4,5,6});
  3.     cout<<addressof(*a.begin())<<"\t"<<addressof(*b.begin())<<endl;
  4.     a.swap(b);
  5.     cout<<addressof(*a.begin())<<"\t"<<addressof(*b.begin())<<endl;
  6.     cout<<"====================================="<<endl;
  7.     vector<int> va({1,2,3});
  8.     vector<int> vb({4,5,6});
  9.     cout<<addressof(*va.begin())<<"\t"<<addressof(*vb.begin())<<endl;
  10.     va.swap(vb);
  11.     cout<<addressof(*va.begin())<<"\t"<<addressof(*vb.begin())<<endl;



运行结果为:

点击(此处)折叠或打开

  1. 0x22fdc0        0x22fda0
    0x22fdc0        0x22fda0
    =========================
    0x2f6950        0x2f6970
    0x2f6970        0x2f6950
这点可以看出,array<> swap之后实际存储位置没变,真正的交换了其内容,而vector<> swap之后存储元素的地址变了,并没有实际交换容器内的内容

另外: string的reserve()函数有可能会缩小其长度,但是vector却不会缩小


另外:判断一个表达式是左值还是右值,可以依靠在下一行,能否继续访问这个表达式 来进行判断
阅读(1617) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~