您的位置:首页 > 游戏 > 游戏 > C++容器之向量(std::vector)

C++容器之向量(std::vector)

2024/10/6 14:30:11 来源:https://blog.csdn.net/flysnow010/article/details/139243923  浏览:    关键词:C++容器之向量(std::vector)

目录

  • 1 概述
  • 2 使用实例
  • 3 接口使用
    • 3.1 construct
    • 3.2 assigns
    • 3.3 iterators
    • 3.4 capacity
    • 3.5 rezize
    • 3.6 reserve
    • 3.7 shrink_to_fit
    • 3.8 access
    • 3.9 assign
    • 3.10 push_back
    • 3.11 pop_back
    • 3.12 insert
    • 3.13 erase
    • 3.14 swap
    • 3.15 clear
    • 3.16 emplace
    • 3.17 emplace_back
    • 3.18 get_allocator

1 概述

  矢量(vector)是序列容器,表示可以更改大小的数组。
  就像数组一样,向量为其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中一样高效。但与数组(array)不同的是,它们的大小可以动态变化,其存储由容器自动处理。
  在内部,向量使用动态分配的数组来存储其元素。当插入新元素时,可能需要重新分配此数组以增加其大小,这意味着分配一个新数组并将所有元素移动到该数组。就处理时间而言,这是一项相对昂贵的任务,因此,每次向容器中添加元素时,矢量不是每次都重新分配。
  相反,矢量容器可以分配一些额外的存储空间来适应可能的增长,因此容器的实际容量可能大于容纳其元素所严格需要的存储空间(即其大小)。库可以实现不同的增长策略,以在内存使用和重新分配之间取得平衡,但在任何情况下,重新分配都只能以对数增长的大小间隔进行,这样在向量末尾插入单个元素就可以提供分摊的恒定时间复杂度(请参阅push_back)。
  因此,与数组(array)相比,矢量(vector)消耗更多的内存,以换取以高效方式管理存储和动态增长的能力。
  与其他动态序列容器(deques、list和forward_lists)相比,向量非常有效地访问其元素(就像数组一样),并且相对有效地从其末端添加或删除元素。对于涉及在末尾以外的位置插入或删除元素的操作,它们的性能比其他操作差,并且迭代器和引用的一致性不如list和forward_list。

其类图如下:
在这里插入图片描述

2 使用实例

void VectorSuite::push_back()
{int array[] = { 1, 2, 3, 4, 5 };std::vector<int> a;std::vector<int> b;std::vector<int> c;for(size_t i = 0; i < ARRAY_SIZE(array); i++)a.push_back(array[i]);TEST_ASSERT_EQUALS(true, a.capacity() > a.size())b.reserve(ARRAY_SIZE(array));for(size_t i = 0; i < ARRAY_SIZE(array); i++)b.push_back(array[i]);TEST_ASSERT_EQUALS(true, b.capacity() == b.size())c.resize(ARRAY_SIZE(array));for(size_t i = 0; i < ARRAY_SIZE(array); i++)c[i] = array[i];TEST_ASSERT_EQUALS(true, c.capacity() == c.size())
}

3 接口使用

3.1 construct

std::vector<int> getVector(int size, int value)
{return std::vector<int>(size, value);
}
void VectorSuite::construct()
{std::vector<int> a;std::vector<int> b(4); // 0 0 0 0std::vector<int> c(4, 5);// 5 5 5 5std::vector<int> d({1, 2, 3, 4, 5});std::vector<int> e(d.begin(), d.end());std::vector<int> f(d);std::vector<int> g(getVector(6, 8));TEST_ASSERT_EQUALS(0, a.size())TEST_ASSERT_EQUALS(4, b.size())TEST_ASSERT_EQUALS(4, c.size())TEST_ASSERT_EQUALS(5, d.size())TEST_ASSERT_EQUALS(5, e.size())TEST_ASSERT_EQUALS(5, f.size())TEST_ASSERT_EQUALS(6, g.size())
}

3.2 assigns

void VectorSuite::assigns()
{std::vector<int> a;std::vector<int> b;std::vector<int> c;a = { 1, 2, 3, 4, 5 };b = a;c = getVector(5, 10);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com