Effective STL -- vector和string

13.vector和string优先于动态分配的数组

  • 使用vector和string和数组相比,减少了管理内存的工作量。
  • 可以使用begin,end,size等函数
  • vector和string拥有iterator,value_type等类型定义。
  • 注意事项:
  • string可能使用引用计数,在多线程环境下同步可能会导致性能变差。

14.使用reserve来避免不必要的内存分配

vector超过容量后会导致删除原来容器的对象,进行析构操作,扩大内存后会对原来数据对象复制构造,降低性能。

15.注意string实现的多样性

16.了解如何把vector和string数据传给旧的API

  • vector:&v[0],&*v.begin()。v.begin为错误方法,vector迭代器的实现可能是类,而非指针。
  • 直接使用&v[0]的问题:v可能时空的,正确方法如下:
    if (!v.empty()) {
        doSomething(&v[0], v.size())
    }
  • string:s.c_str()
  • &s[0]不一定可靠,因为string中数据不一定存储在连续空间,string的内部表示不一定以空字符结尾。
  • s.c_str()会把string内部的第一个空字符当结尾的空字符。
  • s.c_str()所产生的指针并不一定指向字符串数据的内部表示,返回的可能是内部数据的一个不可修改的拷贝。

17.使用"swap技巧"移除多余容量

vector<Contestant>(constestants).swap(contestants);

vector<Contestant>(constestants)创建临时向量

string(s).swap(s);

清空容器:

vector<Contestant>().swap(v)

string().swap(s);

18.避免使用vector<bool>

vector<bool>是假的容器,它并不真的存储bool,相反为了节省空间,它存储的时bool的紧凑表示。

vector<bool>::operator[]返回一个对象,这个对象表现的像一个指向单个位的引用,即所谓的代理对象。

解决方法

  • 使用deque<bool>,deque<bool>内存不是连续的。
  • 使用bitset,不支持插入和删除元素。不支持迭代器。
时间: 2024-10-07 05:33:20

Effective STL -- vector和string的相关文章

Effective STL: 将vector和string的数据传给历史遗留的C风格API

如果有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当作一个数组,只要使用&v[0]就可以了.对于string对象s,相应的咒语是简单的s.c_str(). void doSomething(const int* pInts, size_t numInts); if (!v.empty()) // 如果v为空,&v[0]试图产生一个指向根本就不存在的东西的指针 { doSomething(&v[0], v.size()); } // 以上从vector上

Effective STL:02vector和string

在STL容器中,vector和string的使用频率会更高一些.设计vector和string的目标就是为了替换大多数应用中要使用的数组. 13:vector和string优先于动态分配的数组 一旦要使用new动态分配数组,将要面临很多问题:必须确保delete.必须使用正确的delete形式:必须保证只delete一次.每当发现自己要动态分配一个数组时,都应该考虑用vector和string来代替.vector和string 消除了上述的负担,因为它们自己管理内存.如果你担心还得继续支持旧的代

Effective STL 中文版(大全)

Effective STL 中文版(大全) 作者:winter 候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL.Effective STL是一本非常好的书,帮助你更好的理解STL,其作者就是<Effective C++>一书的作者.如果你已经初步了解了STL的容器.迭代器.算法和函数,而又想更好的了解STL,那么<Effective STL>是你的最佳选择. 还有一部分没有找到链接,如果再找不到我会自己试着翻译一下:) 前言 容器 条款1

迅速读懂:Effective STL (五)

这是<Effective STL>笔记最后一期,不能涵盖全部内容,书后仍然有些附加内容,不在附加,有兴趣可以找原书来读读,一则是区域设置后的忽略大小写比较,另一则是MSVC4-5编译器下STL注意事项 条款41:了解使用ptr_fun.mem_fun和mem_fun_ref的原因 函数和函数对象总使用用于非成员函数的语法形式调用.mem_fun带有一个到成员函数的指针,pmf,并返回一个mem_fun_t类型的对象.这是一个仿函数类,容纳成员函数指针并提供一个operator(),它调用指向在

effective stl(容器部分总结)

还是很喜欢effective部分的书,看了好几遍,这里把stl中和容器相关的一些基本的注意的点进行介绍总结,之后对迭代器等进行总结 1 对序列容器中需要逐个删除的时候,不能像关联容器那样事先对迭代器进行++操作,因为删除一个迭代器,会使他自己无效,后面的迭代器也无效,所以应该保存删除erase返回的下一个指针的值.而关联容器中并不会导致后面的迭代器无效的情况 2 在stl中如果对容器内对象使用了new操作,一定要释放掉,因为析构函数没办法完成,这里最好使用智能指针,但是不要使用auto_ptr的

Effective STL读书摘要(一)

一直在用STL,认为对STL也有一些理解,比如比较函数怎么写,什么情况下用什么容器效率高,但是当你读过Effective STL之后才知道这远远不够,之前的代码还有很多可以优化的空间,下面我会罗列一些映像比较深的点,比较偏向代码因为这样可以方便以后的调用.这里是到Item29,余下的留下次看. 1) 检查容器是否为空 if(c.empty()){}   better than if(c.size()==0){} 2)如果能用批量操作函数就不要用循环来做 批量操作可以提高效率,要有能用批处理尽量批

STL Vector容器

STL Vector容器 Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器.        vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲).         vector尾部添加或移除元素非常快速.但是在中部或头部插入元素或移除元素比较费时        头文件:#include<vector> vector对象的默认构造 vector采用模板类实现, vector对象的默认构造形式: vector<T>

C++学习书籍推荐《Effective STL(英文)》下载

百度云及其他网盘下载地址:点我 作者简介 Scott Meyers is one of the world's foremost authorities on C++, providing training and consulting services to clients worldwide. He is the author of the best-selling Effective C++ series of books (Effective C++, More Effective C+

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v