C++STL容器的学习
文章是本人在学习STL过程中的学习过程,在CSDN上记录一下,为了防止自己忘记,同时也给查资料的人提供一点帮助
1、Vector容器
vector容器,相当于一个动态数组,里面集成了很多对数组的操作,比如说遍历,查找,插入,删除等等操作。重要的是不需要我们定义在栈上时就限定数组的大小,也不需要我们定义在堆上不断的扩充动态数组的大小。使用起来比较方便。
1.1 vector容器的基本用法
std::vector<int> v; //创建一个vector容器
v.capacity(); //容器容量
v.size(); //容器大小
v.at(int idx); //用法和[]运算符相同
v.push_back(); //尾部插入
v.pop_back(); //尾部删除
v.front(); //获取头部元素
v.back(); //获取尾部元素
v.begin(); //头元素的迭代器
v.end(); //尾部元素的迭代器
v.insert(pos,elem); //pos是vector的插入元素的位置
v.insert(pos, n, elem) //在位置pos上插入n个元素elem
v.insert(pos, begin, end);
v.erase(pos); //移除pos位置上的元素,返回下一个数据的位置
v.erase(begin, end); //移除[begin, end)区间的数据,返回下一个元素的位置
reverse(pos1, pos2); //将vector中的pos1~pos2的元素逆序存储
1.2 vector容器的几种构造方式
//< 默认构造
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
//< 区间构造
vector<int>v2(v1.begin(),v1.end());//< 将v1 区间内的元素赋值到v2
//< n个元素构造
vector<int>v3(10,100); //10个100
//< 拷贝构造
vector<int>v4(v3); //< 将v3的元素赋值给v4
1.3 vector容器的赋值方式
//< 利用 = 赋值
vector<int>v1;
vector<int>v2;
v2 = v1;
//< 利用assign函数赋值
vector<int>v3;
v3.assign(v1.begin(), v1.end());//从v1的begin到v1的end
print(v3);
vector<int>v4;
v4.assign(10, 100);
1.4 vector容器的容量和大小
//< 判断容器是否为空
if (v1.empty())
{
cout << "vector v1 is empty" << endl;
}
else
{
cout << "vector v1 is not empty and the capacitty of v1 is " << v1.capacity() << endl;
cout << "the size of v1 is " << v1.size() << endl;
}
//< 使用resize 重新指定容器的大小
v1.resize(15); //超出的部分使用 0 来填充
v1.resize(15,1); //用 1 来代替自动填充的 0
v1.resize(5);
//< vector 的容量
vector<int>v;
for (int i = 0; i < 100000; i++)
{
v.push_back(i);
}
cout << "the capacity of vector v is " << v.capacity() << endl;
cout << "the size of vector of vector v is " << v.size() << endl;
v.resize(3); //不会改变容器的capacity
cout << "the capacity of vector v is " << v.capacity() << endl;
cout << "the size of vector of vector v is " << v.size() << endl;
vector<int>(v).swap(v); //将容器的capacity 和 size 都转换为size
cout << "the capacity of vector v is " << v.capacity() << endl;
cout << "the size of vector of vector v is " << v.size() << endl;
//< 预留空间
//减少因为要插入的数据过大是动态扩展的次数(因为如果数据过大时,在插入时不是一次性插入完的,而是依次开辟空间而动态扩展的
vector<int>v1;
int num = 0;
int *p = NULL;
//v1.reserve(100000);
for (int i = 0; i < 100000; i++)
{
v1.push_back(i);
if (p != &v1[0])
{
p = &v1[0];
num++;
}
}
cout << num << endl;
1.5 vector容器的插入和删除
//< 利用insert插入 或者是 pushback和popback等方式插入
vector<int>v1;
v1.push_back(10);v1.push_back(20);v1.push_back(30); //尾插
v1.push_back(40);v1.push_back(50);print(v1);
v1.pop_back();print(v1); //头插
v1.insert(v1.begin(), 100);print(v1);
v1.insert(v1.begin(),2, 200);print(v1); //从指定位置插入指定长度的指定的数据
//< 容器的删除 利用erase删除特定内容 clear清空容器
v1.erase(v1.begin());print(v1);
v1.erase(v1.begin(), v1.end()-1); print(v1);//从开始删除直到end - 1
v1.clear(); print(v1); //删除全部
1.6 vector容器的数据存取
这里有一点需要着重注意!!
最后一个元素不是end而是back,end指的是最后一个元素的下一个
//< (1)利用" [] " 访问容器内元素
for (int i = 0; i < v1.size(); i++) // size 判断容器内元素的大小
{
cout << v1[i] << " "; //遍历容器内的元素
}
//< (2)利用 at 访问容器内元素
for (int i = 0; i < v1.size(); i++)
{
cout << v1.at(i) << " ";
})
//< (3)第一个和最后一个
cout << "第一个元素为: " << v1.front() << endl;
cout << "最后一个元素为: " << v1.back() << endl;
//< vector容器内元素的呼唤 swap函数
// 首先设置好两个vector容器 v1和v2 并插入不同的数据
v1.swap(v2);
2、Vector容器使用总结
使用过程中,最深切的一点就是在使用动态数组的时候,
终于不用在不断的new 新的数据,还得惦记着去释放,不断的复制数据等到操作。
下面将继续学习STL中的string、map等等容器。