容器

容器简介

容器

Vector

- 概述

  • Vector是一个能够存放任意类型的动态数组
  • Vector的数据结构和操作与数组(array)类似,在内存中的表现形式是一段地址连续的空间
  • Vector与数组的区别在于,数组大小往往是定义是固定的(比如:char buffer[256]);Vec支持动态空间大小调整,随着空间的变化Vector内部会自动扩充内存空间
  • 为了试用Vector,必须试用include指令包含该头文件,并通过std空间去访问:
    include <vector>
    int main() {
        std :: vector v;
    }

创建vector

常用方式 代码
创建一个T类型的空vector std :: vector v;
创建一个容器是n的T类型的vector std :: vector v(n);
创建一个容量是n的T类型的vector,并且都初始化为i std :: vector n(n, i);
创建一个已有v的拷贝 std :: vector copyOfV(v);
荣国一个数组创建一个vector int array[] = {1,2,3}; std :: vector v(array, array + 10);

向vector添加元素

向vector添加元素的方法为调用其push_back()函数,表示将元素添加至其尾部:

std :: vector <std :: wstring> v3;
for (std :: size_t i = 0; i < 10; ++ i) {
    std :: wstringstream wss;
    wss << TEXT("String[") << i << TEXT("]");
    v3.push_back(wss.str());
}

判断vector是否为空、获取vector大小

  • 如果要判断vector是否为空则调用empty()函数
  • 如果要获取vector大小则调用size()函数
    std :: vector <std :: wstring> v3;
    bool isEmpty = v3.empty();
    
    int array[] = {1,2,3,4,5,6,7,8,9,10};
    std :: vector<int> v(array, array + 10)
    std :: size vSize = v.size();

访问vector中元素

  • 要访问vector中的元素, 有两种方法:
    • 调用vector :: at()
    • 调用vector :: operator[]
  • 两者的区别在于:
    • operator[]提供了类似数组的存取方式,但不做边界的检查,有可能越界,但访问效率更高
    • at()进行边界检查,如果访问越界则抛出exception,但是访问效率不如operator[]
std :: vector<std::wstring> v;
v.reserve(10);
for (std::size_t i = 0; i < 3; ++ i) {
    std :: wstringstream wss;
    wss << TEXT("String[") << i << TEXT("]");
    v.push_back(wss.str());
}

try {
    std :: wstring wsz1 = v[5]; // not bounds checked -will not throw
    std :: wstring wsz2 = v.at(5); // bounds checked -will throw if out of range
}
catch (const std :: exception& ex) {
    Console :: WriteLine(ex.what());
}

删除vector中的元素

  • clear:清除一整个vector
  • pop_back:弹出vector为元素
  • erase:删除vector中某一位置的元素
    • 用法一:指定iterator删除某一元素
      std :: vector<int> :: const_iterator it = v.begin();
      v.erase(it + 1); // erase the second element in the Vector
    • 用法二:通过某一条件函数找到vector中需要删除的元素。所谓条件函数是一个按照用户定义的条件返回true/false的函数对象。我们以remove_if为例说明。
    • remove_if函数定义在algorithm中,故需要include
    • 定义筛选器:一个一元函数对象(unary_function),关键在于重载operator()
      struct ContainsString : public std :: unary_function <std :: wstring, bool> {
          ContainsString (const std::wstring& wszMatch) : m_wszMatch(wszMatch) {}
      
          bool operator()(const std :: wstring& wszStringToMatch) const {
              //注意因为它重载了()所以可以当一个函数来用
              return (wszStringToMatch.find(m_wszMatch) != 1);
          }
      
          std :: wstring m_wszMatch;
      }
    • 在erase函数中调用remove_if执行删除:
      v.erase (std :: remove_if (
          v.begin(),
          v.end(),
          ContainsString (L"C++")
      ),
        v.end());
    • remove_if是不是真正remove了vector中的元素呢?
      remove_if其实真正的做的事针对ContainsString条件对给出了erase函数需要操作的iterator位置。

Deque

  • 概述
    • Deque事一个能够存放任意类型的双向队列
    • Deque提供的函数与vector类似,新增了两个函数:
      • push_front:在头部插入一个元素
      • pop_front: 在头部弹出一个元素
    • Deque采用了与vector不同的内存管理方式:大块分配内存
    • 为了试用deque,必须用include质量包含如下文件,并通过std命名空间访问:
      #include <deque>
      int main() {
          std :: deque dq;
      }

      List

  • 概述
    • List是一个能够存放任意类型的双向链表(double linked list)
    • 可以向List中接入一个子链表(sub-list)
    • 为了使用List,必须使用include指令包含如下文件,并通过std命名空间去访问:
      #include <list>
      int main() {
          std :: list l;
      }

创建List

常用方式 代码
创建一个T类型的空list std :: list l;
创建一个容量是n的T类型的list std :: list l(n);
创建一个容量是n的T类型的list,并且初始化都为x std :: list l(n, x);
创建一个已有list的拷贝 std :: list copyOfList(l);
通过一个数组创建一个list std :: wstring array[] = {1,2,3}; std :: list l(array, array + 3)
  • 向list添加元素
    • 向list添加元素的方式为调用其push_back, push_front函数将元素添加至其尾部或头部

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!