1.序列式容器-vectorlist
vector是一个动态数组,方便存放所有类型的变量。顺序存放在内存空间里面,当预申请的空间不足时:①首先申请一片更大的内存空间②将原数据拷贝进新空间③释放原空间
如图1所示:
为什么要保留预留空间,原因是防止频繁的内存申请和释放,一般都会多申请两倍的空间。
vector常用方法:
push_back() //从尾部加入元素
pop_back() //从尾部弹出元素
size() //获取vector大小
insert() //在指定位置插入元素
earse() //删除指定元素
clear() //情空vector
对vector其它操作:
reverse() //反转vec
sort() //对vec里面的元素进行排序
示例代码:
//
// Created by wsk on 25-10-20.
//
#ifndef VECTOR_H
#define VECTOR_H
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;inline void testvector()
{vector<int> vec(2,9);auto it1 = vec.begin();while (it1 != vec.end()){cout <<*it1<<" " ;++it1;}cout << endl;cout << "size=" << vec.size() << endl;cout << "capacity=" << vec.capacity() << endl;vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.push_back(4);vec.push_back(5);cout << "size=" << vec.size() << endl;cout << "capacity=" << vec.capacity() << endl;vec.pop_back();vec.pop_back();// 9 9 1 2 3const auto it2 = find(vec.cbegin(), vec.cend(), 1);if (*it2){vec.erase(it2);// 9 9 2 3// cout << *it2 << endl;// 2}auto it3 = vec.begin();while (it3 != vec.end()){cout <<*it3<<" " ;++it3;}cout << endl;const auto it4 = find(vec.cbegin(), vec.cend(), 2);if (*it4){vec.insert(it4, 3,7);// 9 9 7 7 7 2 3}for(int i= 0;i<vec.size();i++){cout <<vec[i]<<" " ;}cout << endl;// reverse(vec.begin(), vec.end());// 反转sort(vec.begin(), vec.end());// 排序for(int i= 0;i<vec.size();i++){cout <<vec[i]<<" " ;}cout << endl;vec.erase(vec.begin()+5);cout << vec[5]<<endl;vec.clear();cout << "size=" << vec.size() << endl;cout << "capacity=" << vec.capacity() << endl;
}
#endif //VECTOR_H
通过sort来自定义比较规则:
// 内置比较器
sort(vec.begin(), vec.end(),less_equal<int>());// 默认行为,升序排序
sort(vec.begin(), vec.end(),greater_equal<int>());// 降序排序// 函数指针
struct Person {std::string name;int age;
};
bool ageGreater(const Person& a, const Person& b) {return a.age > b.age; // 年龄大的在前(降序)
}
std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}};
std::sort(people.begin(), people.end(), ageGreater); // 传入函数指针
list是一个双向链表,数据随机存取在内存里面,在逻辑上是有序的。
下面对插入操作进行简单的图解
list常用方法:
push_back();
insert();
push_front();
erase();
clear();
unique(); // 连续相同的元素只保留一个
splice(); // 拼接两个链表
merge(); // 归并两个有序链表
reverse();
sort();
示例代码:
//
// Created by wsk on 25-10-20.
//
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;int main()
{vector<int> v1 = {3 ,4 ,5 ,8 ,11};list<int> mylist(1,0);list<int> mylist2(v1.begin(),v1.end());// 3 4 5 8 11// auto it = mylist2.begin();// while (it != mylist2.end())// {// cout << *it << " ";// ++it;// }// cout << endl;mylist.push_back(1);mylist.push_back(2);mylist.push_back(3);mylist.push_back(4);const auto it2 = find(mylist.begin(),mylist.end(),3);if (*it2){mylist.insert(it2,99);// 0 1 2 99 3 4}// auto it = mylist.begin();// while (it != mylist.end())// {// cout << *it << " ";// ++it;// }auto it3= find(mylist.begin(), mylist.end(), 3);if (*it3){// mylist.erase(it3);cout << *(mylist.erase(it3)) << endl;// 4}// auto it = mylist.begin();// while (it != mylist.end())// {// cout << *it << " ";// 0 1 2 99 4// ++it;// }auto it4 = find(mylist.begin(), mylist.end(), 99);if (*it4){mylist.splice(it4,mylist2);// 拼接 0 1 2 3 4 5 8 11 99 4}// mylist.reverse();// 反转 4 99 11 8 5 4 3 2 1 0reverse(mylist.begin(),mylist.end());// 反转mylist.sort();// 排序 0 1 2 3 4 4 5 8 11 99// mylist2.sort();// 不能使用算法头文件里面的sort因为算法头文件里面默认的iterator是随机访问迭代器和链表里面的迭代器不一样// mylist.merge(mylist2);// 归并,前提是两个链表要有序 list:0 1 2 99 list2:3 ,4 ,5 ,8 ,11// mylist.unique();// 连续的相同元素只保留一个// mylist.remove(3);// 删除指定元素// mylist.clear();auto it = mylist.begin();while (it != mylist.end()){cout << *it << " ";++it;}return 0;
}