vector 是一个动态数组,方便存放所有类型的变量。顺序存放在内存空间里面,当预申请的空间不足时:①首先申请一片更大的内存空间②将原数据拷贝进新空间③释放原空间
如图1所示:
为什么要保留预留空间,原因是防止频繁的内存申请和释放,一般都会多申请两倍的空间。
vector常用方法:
cpp
push_back() //从尾部加入元素
pop_back() //从尾部弹出元素
size() //获取vector大小
insert() //在指定位置插入元素
earse() //删除指定元素
clear() //情空vector
对vector其它操作:
cpp
reverse() //反转vec
sort() //对vec里面的元素进行排序
示例代码:
cpp
//
// 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 3
const 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来自定义比较规则:
cpp
// 内置比较器
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常用方法:
cpp
push_back();
insert();
push_front();
erase();
clear();
unique(); // 连续相同的元素只保留一个
splice(); // 拼接两个链表
merge(); // 归并两个有序链表
reverse();
sort();
示例代码:
cpp
//
// 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 0
reverse(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;
}