zoukankan      html  css  js  c++  java
  • 创建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 数组中的字符串对象现在都是空字符串。

  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/renzmin/p/11898806.html
Copyright © 2011-2022 走看看