介绍
成员函数
- 构造析构
- 元素访问
- 迭代器
- 容量
- 修改器
非成员函数
介绍
// vector 模板定义
template > class vector;
namespace pmr { // c 17 起
template
using vector = std::vector>;
}
- vector 介绍摘选自 cppreference.com 中文网 vector 介绍
- t 必须满足可复制赋值 (copyassignable) 和可复制构造 (copyconstructible) 的要求(c 11 前),泛言之,要求元素类型是完整类型并满足可擦除 (erasable) 的要求,但许多成员函数附带了更严格的要求 (c 11 起)
- allocator 动态获取/释放内存及构造/析构内存中元素的分配器,若allocator::value_type 与 t 不同则行为未定义
- 包含在头文件 vector 中,可以理解为动态数组,其内存是动态增长的,当空间不够存储时自动分配内存,分配策略不同编译器实现可能不同,但绝对不是用多少分配多少,这样效率不高
- 元素是连续存储的,访问元素可以通过迭代器和指针
- 随机访问复杂度 o(1),在末尾插入或移除元素 o(1),插入或移除元素,与到 vector 结尾的距离成线性 o(n)
- std::vector (对于 bool 以外的 t )满足容器 (container) 、知分配器容器 (allocatorawarecontainer) 、序列容器 (sequencecontainer) 、连续容器 (contiguouscontainer) (c 17 起)及可逆容器 (reversiblecontainer) 的要求元素的类型
成员函数
构造析构
#include
int main()
{
auto print = [](const std::string&msg, const std::vector& vec) { // 打印
std::cout << msg << " : ";
for (int val : vec)
std::cout << val << "\t";
std::cout << "\n";
};
std::vector vec1; // 默认无参构造
print("vec1", vec1);
std::allocator alloc2;
std::vector vec2(alloc2); // 指定分配器
print("vec2", vec2);
std::vector vec3(5, 10); // 初始化 5 个元素,每个元素初始化值为 10
print("vec3", vec3);
std::vector vec4(5); // 初始化 5 个元素,每个元素初始化值为 0
print("vec4", vec4);
std::vector::iterator itbegin = vec3.begin();
std::vector::iterator itend = vec3.end();
std::vector vec5(itbegin, itend); // 迭代器初始化
print("vec5", vec5);
std::vector vec6(vec5); // 拷贝构造
print("vec6", vec6);
std::vector vec7(vec6, alloc2); // 拷贝构造,指定分配器类型
print("vec7", vec7);
std::vector vec8(std::move(vec5)); // 移动构造
print("vec8", vec8);
std::vector vec9(std::move(vec6), alloc2); // 移动构造,指定分配器类型
print("vec9", vec9);
std::vector vec10{1,2,3,4,5}; // 初始化列表
print("vec10", vec10);
// ~vector(); 默认析构函数
return 0;
}
输出结果:
vec1 :
vec2 :
vec3 : 10 10 10 10 10
vec4 : 0 0 0 0 0
vec5 : 10 10 10 10 10
vec6 : 10 10 10 10 10
vec7 : 10 10 10 10 10
vec8 : 10 10 10 10 10
vec9 : 10 10 10 10 10
vec10 : 1 2 3 4 5
元素访问
#define cout(msg, x) std::cout< vec{1,2,3,4,5}; // 初始化列表
cout("vec.at(0) : ", vec.at(0)); // 访问指定下标的元素,同时进行越界检查
cout("vec[2] : ", vec[2]); // 访问指定下标的元素
cout("vec.front() : ", vec.front()); // 访问第一个元素
cout("vec.back() : ", vec.back()); // 访问最后一个元素
cout("*vec.data() : ", *vec.data()); // 返回指向内存中数组第一个元素的指针
return 0;
}
输出结果:
vec.at(0) : 1
vec[2] : 3
vec.front() : 1
vec.back() : 5
*vec.data() : 1
迭代器
int main()
{
std::vector vec{1,2,3,4,5}; // 初始化列表
std::vector::iterator iter = vec.begin(); // 返回指向起始的迭代器,读写迭代器
for (; iter != vec.end(); iter) {
std::cout << *iter << "\t";
}
std::cout << "\n";
std::vector::const_iterator citer = vec.cbegin();// 返回指向起始的迭代器,只读迭代器
for (; citer != vec.cend(); citer) {
std::cout << *citer << "\t";
}
std::cout << "\n";
std::vector::reverse_iterator riter = vec.rbegin();// 逆向返回指向起始的迭代器,读写迭代器
for (; riter != vec.rend(); riter) {
std::cout << *riter << "\t";
}
std::cout << "\n";
std::vector::const_reverse_iterator criter = vec.crbegin();// 逆向返回指向起始的迭代器,只读迭代器
for (; criter != vec.crend(); criter) {
std::cout << *criter << "\t";
}
std::cout << "\n";
return 0;
}
输出结果:
1 2 3 4 5
1 2 3 4 5
5 4 3 2 1
5 4 3 2 1
容量
int main()
{
std::vector vec{1,2,3,4,5}; // 初始化列表
std::cout << std::boolalpha << "vec.empty() : " << vec.empty() << "\n"; // 是否为空
std::cout << "vec.size() : " << vec.size() << "\n"; // 容器元素数量
std::cout << "vec.max_size() : " << vec.max_size() << "\n"; // 容器可容纳的最大数量,和平台相关
std::cout << "vec.capacity() : " << vec.capacity() << "\n"; // 容器容量 >= 容器元素数量
vec.reserve(20); // 容器预留空间
std::cout << "vec.capacity() : " << vec.capacity() << "\n";
vec.shrink_to_fit(); // 通过释放未使用的内存减少内存的使用
std::cout << "vec.capacity() : " << vec.capacity() << "\n";
return 0;
}
输出结果:
vec.empty() : false
vec.size() : 5
vec.max_size() : 4611686018427387903
vec.capacity() : 5
vec.capacity() : 20
vec.capacity() : 5
修改器
int main()
{
auto print = [](const std::string&msg, const std::vector& vec) { // 打印
std::cout << msg << " : ";
for (int val : vec)
std::cout << val << "\t";
std::cout << "\n";
};
std::vector vec{1,2,3,4,5}; // 初始化列表
print("origin vec", vec);
vec.clear(); // 清除容器
print("vec.clear", vec);
vec.insert(vec.begin(), {1,2,3,4,5}); // 插入元素,insert 函数有好几个重载函数
print("vec.insert", vec);
vec.emplace(vec.end(), 6); // 原位构造元素
print("vec.emplace", vec);
vec.erase(vec.begin(), vec.begin() 1); // 擦除元素
print("vec.erase", vec);
vec.push_back(7); // 将元素添加到容器末尾
print("vec.push_back", vec);
vec.emplace_back(8); // 在容器末尾就地构造元素
print("vec.emplace_back", vec);
vec.pop_back(); // 移除末尾元素
print("vec.pop_back", vec);
vec.resize(2); // 改变容器中可存储元素的个数
print("vec.resize", vec);
std::vector vec2;
vec2.swap(vec);
print("vec2", vec2);
print("vec", vec);
return 0;
}
输出结果:
origin vec : 1 2 3 4 5
vec.clear :
vec.insert : 1 2 3 4 5
vec.emplace : 1 2 3 4 5 6
vec.erase : 2 3 4 5 6
vec.push_back : 2 3 4 5 6 7
vec.emplace_back : 2 3 4 5 6 7 8
vec.pop_back : 2 3 4 5 6 7
vec.resize : 2 3
vec2 : 2 3
vec :
非成员函数
int main()
{
auto print = [](const std::string&msg, const std::vector& vec) { // 打印
std::cout << msg << " : ";
for (int val : vec)
std::cout << val << "\t";
std::cout << "\n";
};
std::vector vec1{1,2,3,4,5}; // 初始化列表
std::vector vec2{1,2,3,4,6};
std::cout << std::boolalpha << "vec1 == vec2 : " << (vec1 == vec2) << "\n";
std::cout << std::boolalpha << "vec1 != vec2 : " << (vec1 != vec2) << "\n";
std::cout << std::boolalpha << "vec1 > vec2 : " << (vec1 > vec2) << "\n";
std::cout << std::boolalpha << "vec1 >= vec2 : " << (vec1 >= vec2) << "\n";
std::cout << std::boolalpha << "vec1 < vec2 : " << (vec1 < vec2) << "\n";
std::cout << std::boolalpha << "vec1 <= vec2 : " << (vec1 <= vec2) << "\n";
std::vector vec3;
std::swap(vec1, vec3); // 交换元素
print("vec1", vec1);
print("vec3", vec3);
return 0;
}
输出结果:
vec1 == vec2 : false
vec1 != vec2 : true
vec1 > vec2 : false
vec1 >= vec2 : false
vec1 < vec2 : true
vec1 <= vec2 : true
vec1 :
vec3 : 1 2 3 4 5
起始