这个函数同样也是一个很常见的函数,它和上面的函数作用正好相反,上面进行的是尾插操作,这里进行的是尾删操作,也就是说把尾部的数据进行删除,当然如果是一个空的vector,他是会报assert错误的,因为这个是空的,所以不能再进行删除操作了,下面小编就展示一下它的用法: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 using
v3.insert(v3.begin()+3,7);//在v3第三个元素前插入7v3.insert(v3.begin()+1,2,8);//在v3第二个元素前插入2个8vector<int>::iterator first = v.begin()+3; vector<int>::iterator end =v.end(); v3.insert(v3.end(), first, end);//在v3.end()后将区间[v1.begin()+3, v1....
我们这里先实现一个简单的 push_back,以便于我们能先把 vector 跑起来。 因为是阉割版,我们的 push_back 也自然没有空间配置器,我们就用 new 去替代它。 首先思考,尾插需要做哪些事? Step1:检查是否需要增容 需要增容,就先增容后再插入数据;不需要增容,就直接插入数据。 我们先去思考,如何判断是否需要增容 —...
= v.end(); it++) { cout << *it << " "; } cout << endl; } void test01(){ vector<int> v1; //尾插 v1.push_back(10);//尾部插入元素ele v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50...
string 能用 += 主要是 string 不仅可以尾插一个字符还可以追加一个字符串。 但是vector 就只支持一个一个数据的插入和删除,push_back 和 pop_back。 vector 的接口和我们在数据结构实现过的顺序表都差不多。 而且学了string 大多都会用了,所以只简单介绍几个,剩下的可以自己查文档。
#include<vector> using namespace std; struct ListNode{ int val; struct ListNode* next; ListNode(int x) : val(x), next(NULL){ } }; int main(){ int num; cin >> num; ListNode* head = new ListNode(num); ListNode* p = head; ...
~Vector(); //析构函数 public: //公共接口 void PushBack(const T &); //尾插 void PopBack(); //尾删 Iterator Find(const T &); //查找 void Insert(Iterator*); //插入 void Erase(Iterator*); //删除 void Size(); //获取有效元素个数 bool Empty(); //判断是否为空 void clear(); ...
Vector优点:可使用下标随机访问,尾插尾删效率高。 缺点:前面部分的插入删除效率低,扩容有消耗,可能存在一定的空间浪费。 底层是由一块连续的内存空间组成,由三个指针实现的分别是头指针(表示目前使用空间的头),尾指针(表示目前使用空间的尾)和可用空间尾指针实现 List优点:按需申请内存,不需要扩容,不会造成内存空间...
头插法建立单链表的算法虽然简单,但生成的链表中结点的次序和输入数据的顺序不一致。若希望两者次序一致,可采用尾插法。 该方法是将新结点逐个插入到当前链表的表尾上,为此必须增加一个尾指针 r, 使其始终指向当前链表的尾结点,否则就无法正确的表达链表。
通过vec[3] =3可改变vector容器的值,这是因为[]操作符返回的就是引用。也就是为内部的变量取了一个别名,还能让[]操作符返回一个指针,即*vec[3]=3。实际上引用可以做的事情指针都可以做,那为什么还要使用引用? 总结 用恰当的工具做恰如其分的工作。 指针可以毫无约束的操作内存中的任何东西,功能十分强大,但...