vector()
在C++中,vector是一个动态数组容器,可以存储一系列相同类型的元素,它是标准库中定义的模板类。
vector的定义和结构非常简单,它由以下几个重要的部分组成:模板类声明:vector是一个模板类,因此在使前需要包含头文件。
声明一个vector对象的通用语法如下:
std::vector vec;
这里的T是要存储在vector中的元素类型。
vector的定义和特性
容器大小:
vector是一个动态数组,可以根据需要自动调整大小。它会根据元素的数量动态分配内存空间。
元素访问:
可以通过索引来访问vector中的元素。索引从0开始,最后一个元素的索引是size()-1。可以使用[]运算符或at()函数来访问元素
元素添加和删除:
可以使用 push_back() 函数在vector的末尾添加元素,使用 pop_back() 函数删除末尾的元素。还可以使用 insert() 函数在指定位置插入元素,使用 erase() 函数删除指定位置的元素。
容器大小管理:
可以使用size() 函数获取vector中元素的数量,使用 empty() 函数检查vector是否为空。还可以使用resize() 函数调整vector的大小。
迭代器:
vector提供了迭代器,可以用于遍历容器中的元素。可以使用begin()函数获一个元素的迭代器,使用end()函数获取指向最后一个元素之后位置的选代器。
push_back():将元素添加到vector的末尾
pop_back():删除vector末尾的元素(一定要保证vector容器非空)
begin()和end():返回vector的第一个元素和最后一个元素之后位置的迭代器。
vector排序去重
首先,需要对vector进行排序,以便相同的元素相邻。然后,std::unique函数将重复的元素移动到vector的末尾,并返回一个指向不重复元素的迭代器。最后,可以使用vec.erase函数将重复元素从vector中删除。
#include<vector>
#include<algorithm>
int main()
{vector<int>num;num.push_back(5);num.push_back(2);num.push_back(8);num.push_back(5);num.push_back(1);num.push_back(2);num.push_back(9);num.push_back(8);cout << "原始向量元素";for (const auto& i : num){cout << i << " ";}cout << endl;//排序sort(num.begin(), num.end());cout << "排序后";for (const auto& i : num){cout << i << ' ';}cout << endl;//取出重复元素num.erase(unique(num.begin(), num.end()), num.end());cout << "去重后";for (const int& i : num){cout << i << " ";}cout << endl;//向向量中插入元素num.insert(num.begin() + 2, 3);cout << "插入元素后";for (const int& i : num){cout << i << " ";}cout << endl;//删除某个元素num.erase(num.begin() + 4);cout << "删除后";for (const int& i : num){cout << i << " ";}//检查容器是否为空if (num.empty()){cout << "容器为空" << endl;}else{cout << "容器不为空" << endl;}cout << "容器大小" << num.size() << endl;//清空向量num.clear();if (num.empty()){cout << "容器为空" << endl;}else{cout << "容器不为空" << endl;}return 0;
}
运行结果:
list(链表)
list的使用频率不高,在做题时极少遇到需要使用list的情景。list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器,list容器以节点(node)的形式存储元素,并使用指针将这些节点链接在一起,形成一个链表结构。list容器的定义和结构如下:
list容器模板接受两个参数:
1.T:指定容器中存储的元素类型,
2.Allocator(可选):指定用于分配内存的分配器类型,默认为std::allocator。list容器的特点包括:
节点和后一个节点的指针,因此可以在常双向性:每个节点都包含指向前一个数时间内在链表中的任意位置进行插入删除和访问操作。·动态大小:链表的大小可以根据需要动态扩展或收缩,不需要预先指定容器的大小。·不连续存储:链表中的节点可以在内存中的任意位置分布,不要求连续存因此插入和删除操作不会导致元素的移动。list容器提供了一系列成员函数和迭代器来操作和访问链表中的元素,包反转等操作。可以使用迭代器来遍历链表中的元素.
在上述示例中,我们首先创建了一个ist容器myList,然后使用push back()和push front()函数分别在链表尾部和头部插入元素。最后,使用范围基于范围的for循环遍历链表并输出元素。需要注意的是,由于iist是双向链表,因此插入和删除操作的时间复杂度是常量时间O(1),但访问和查找操作的时间复杂度是线性时间O(n),其中n是链表的大小。因此,如果需要频繁进行随机访问操作,可能更适合使用支持随机访问的容器,如vector或deque。
list的常用函数
list容器提供了多个常用的成员函数来操作和访问链表中的元素。以下是一些常用的list函数的解释:
1.push_back():将元素插入到链表的末尾,
2.push_front():将元素插入到链表的开头。
移除链表末尾的元素3.pop back():
4.pop_front():移除链表开头的元素。
5.size():返回链表中元素的个数。
6.empty():检查链表是否为空
清空链表中的所有元素7.clear():
8.front():返回链表中第一个元素的引用。
9.back():返回链表中最后一个元素的引用。
10.begin():返回指向链表第一个元素的迭代器
11.end():返回指向链表末尾的下一个位置的迭代器。
12.insert():在指定位置之前插入一个或多个元素。
13.erase():从链表中移除指定位置的一个或多个元素,
stack(栈)
stack是一种后进先出的数据结构,使用前需要包含头文件。stack提供了一组函数来操作和访问元素,但它的功能相对较简单。stack的定义和结构如下(仅作了解即可):
push(x):在栈顶插入元素 x
pop():弹出栈顶元素
top():返回栈顶元索
empty():检查栈是否为空
size():返回栈中元素的个数
注意: stack不能被遍历
小tips:如果将一个数组的元素依次放入栈,再依次取出,则可以将数组翻转。