容器
容器简介
容器
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 |
创建一个容器是n的T类型的vector | std :: vector |
创建一个容量是n的T类型的vector,并且都初始化为i | std :: vector |
创建一个已有v的拷贝 | std :: vector |
荣国一个数组创建一个vector | int array[] = {1,2,3}; std :: vector |
向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位置。
- 用法一:指定iterator删除某一元素
Deque
- 概述
- 概述
- List是一个能够存放任意类型的双向链表(double linked list)
- 可以向List中接入一个子链表(sub-list)
- 为了使用List,必须使用include指令包含如下文件,并通过std命名空间去访问:
#include <list> int main() { std :: list l; }
创建List
常用方式 | 代码 |
---|---|
创建一个T类型的空list | std :: list |
创建一个容量是n的T类型的list | std :: list |
创建一个容量是n的T类型的list,并且初始化都为x | std :: list |
创建一个已有list的拷贝 | std :: list |
通过一个数组创建一个list | std :: wstring array[] = {1,2,3}; std :: list |
- 向list添加元素
- 向list添加元素的方式为调用其push_back, push_front函数将元素添加至其尾部或头部
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!