• 创建vector<T>容器


    vector<T> 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector<T> 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素个数超出 vector 当前容量,就会自动分配更多的空间。只能在容器尾部高效地删除或添加元素。

    vector<T> 容器可以方便、灵活地代替数组。在大多数时候,都可以用 vector<T> 代替数组存放元素。只要能够意识到,vector<T> 在扩展容量,以 及在序列内部删除或添加元素时会产生一些开销;但大多数情况下,代码不会明显变慢。 为了使用 vector<T> 容器模板,需要在代码中包含头文件 vector。

    创建vector<T>容器

    下面是一个生成存放 double 型元素的 vector<T> 容器示例:

    1. std::vector<double> values;

    因为容器中没有元素,所以没有分配空间,当添加第一个数据项时,会自动分配内存。可以像下面这样通过调用 reserve() 来增加容器的容量:

    1. values.reserve(20);

    这样就设置了容器的内存分配,至少可以容纳 20 个元素。如果当前的容量已经大于或等于 20 个元素,那么这条语句什么也不做。注意,调用 reserve() 并不会生成任何元素。values 容器这时仍然没有任何元素,直到添加了 20 个元素后,才会分配更多的内存。调用 reserve() 并不会影响现有的元素。

    当然,如果通过调用 reserve() 来增加内存,任何现有的迭代器,例如开始迭代器和结束迭代器,都会失效,所以需要重新生成它们。这是因为,为了增加容器的容量,vector<T> 容器的元素可能已经被复制或移到了新的内存地址。

    创建 vector 容器的另一种方式是使用初始化列表来指定初始值以及元素个数:

    1. std::vector<unsigned int> primes {2u, 3u, 5u, 7u, 11u, 13u, 17u, 19u};

    以初始化列表中的値作为元素初始值,生成有 8 个素数的 vector 容器。

    分配内存是比较花费时间的,所以最好只在必要时分配。vector 使用算法来增加容量,这个算法依赖一个经常使用的常对数来实现,这在早些时候会导致分配一些非常小的内存,但是随着 vector 容量的增大,内存增长数也会变大。可以如下所示,使用初始元素个数来生成 vector 容器:

    1. std::vector<double> values(20);

    这个容器开始时有 20 个元素,它们的默认初始值都为 0。生成容器时,同时指定元素个数,就能够减少空间额外分配的次数,这是一个很好的习惯。

    注意,圆括号中的 20 表示元素的个数,是上述语句的核心。这里不能使用 {}。如果如下所示定义 vector 容器,会产生不同的结果:

    1. std::vector<double> values {20};

    vector 并没有 20 个元素。它只有一个元素,并以 20 作为初始值。添加元素会导致分配额外的内存。

    如果不想用 0 作为默认值,可以指定一个其他值:

    1. std::vector<long> numbers(20, 99L);

    第二个参数指定了所有元素的初始值,因此这 20 个元素的值都是 99L。第一个元素指定了 vector 中的元素个数,它不需要是一个常量表达式。它可以是一个表达式执行后的结果,也可以是从键盘输入的数。

    可以用元素类印相同的容器来初始化 vector<T> 容器。用一对迭代器来指定初始值的范围。下面是一个示例:

    1. std::array<std :: string, 5> words {"one", "two","three", "four", "five"};
    2. std::vector<std::string> words_copy {std::begin(words) , std::end(words)};

    words_copy 被 words 数组容器中的元素初始化。如果使用移动迭代器指定 words_copy 的初始化范围,words 中的元素将会从 words 移到 words_copy。这里有一个示例:

    1. std::vector<std::string〉 words_copy {std::make_move_iterator(std::begin(words)),std::make_move_iterator(std:: end(words))};

    words_copy 会像前面那样被初始化。但元素是移动过来的而不是复制过来的,所以 words 数组中的字符串对象现在都是空字符串。

  • 相关阅读:
    UI-iOS开发中@property的属性weak nonatomic strong readonly等介绍
    UIView之userInteractionEnabled属性介绍
    UI-target...action设计模式,手势识别器.UIimageview
    UI-事件处理
    IOS开发—事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别
    UI-事件,触摸与响应者链(一)
    第47月第11天 iOS 文件下载Download,支持断点续传、后台下载、设置下载并发数
    第47月第10天 telnet rpm包安装
    第47月第5天 openresty
    第47月第4天 arkit录制
  • 原文地址:https://www.cnblogs.com/renzmin/p/11898806.html
Copyright © 2020-2023  润新知