C+++——STL(序列容器)

序列容器:

类型备注
array增加了成员函数begin() end() at()与全局函数get()等;不可增删,固定大小;
vector默认尾删增;内存连续;
deque双向队列;相对vector增加了头删增;内存可不连续;
list双向链表
forward_list前向链表/单向链表

代码:(运行需要自行注释部分代码)

(array)

#include<iostream>
#include<array>
using namespace std;

int main() {
    array<int, 5> nums = {};//申明类型为int大小为5的array
    for (int i = 0; i < nums.size(); i++)//对array赋值 at()代替[]更加安全
        nums.at(i) = i;
    for (auto iter = nums.begin(); iter != nums.end(); iter++)//使用指针遍历array
        cout << *iter << " ";
    cout << get<2>(nums);//使用全局函数get<>()获取指定位置元素
    return 0;
}

(vector)

#include<iostream>
#include<vector>
#include<algorithm>//用于remove()
using namespace std;

int main() {
    //声明
    vector<int> nums;//默认大小0
    vector<int> nums(10);//大小为10,默认值为0
    vector<int> nums(10, 1.0);//大小为10,默认值为1.0
    vector<int> nums = { 1,2,3,4,5,5,5,6 };//大小为5
    vector<int> nums2(nums);//直接复制nums的值与大小
    vector<int> nums2(nums.begin(), nums.begin() + 3);//复制nums前3元素
    
    //遍历
    for (int iter : nums)
        cout << iter << " ";
    for (auto iter = nums.begin(); iter != nums.end(); iter++)
        cout << *iter << " ";
    for (int iter = 0; iter < nums.size(); iter++)
        cout << "nums[" << iter << "]=" <<nums[iter]<<" ";

    //尾部增加与删减
    nums.push_back(6);//先创建元素再移动拷贝
    nums.emplace_back(6);//直接在尾部创建元素
    nums.pop_back();

    //特定位置增加
    nums.insert(nums.begin()+2, 1);//在nums[2]插入1
    nums.insert(nums.begin()+2, 5, 3);//在nums[2]插入5个3
    nums.insert(nums.begin() + 2, nums2.begin(), nums2.end());//在nums[2]插入nums2
    nums.insert(nums.begin() + 2, { 4,5,9,8,100 });//在nums[2]插入{ 4,5,9,8,100 }
    nums.emplace(nums.begin() + 2, 300);//在nums[2]插入300 emplace只能插入单个元素 但效率比insert高

    //特定位置的删除
    nums.erase(nums.begin()+3);//删除nums[3]
    nums.erase(nums.begin(), nums.begin() + 2);//删除前两个元素

    //特定值的删除(remove()在algorithm中 不改变vector的size和capacity)
    auto iter1=remove(nums.begin(), nums.end(), 5);//移除所有为5的元素
    for (auto iter=nums.begin();iter!=iter1;iter++)//输出移除后的vector
        cout << *iter << " ";

    nums.clear();//容器清空
    nums.swap(nums2);//向量元素交换

    return 0;
}

(deque)

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;

int main() {
    //声明
    //deque<int> nums;//默认大小0
    //deque<int> nums(10);//大小为10,默认值为0
    //deque<int> nums(10, 1.0);//大小为10,默认值为1.0
    deque<int> nums = { 1,2,3,4,5,5,5,6 };//大小为5
    //deque<int> nums2(nums);//直接复制nums的值与大小
    deque<int> nums2(nums.begin(), nums.begin() + 3);//复制nums前3元素
    
    //遍历
    cout << endl;
    for (int iter : nums)
        cout << iter << " ";
    for (auto iter = nums.begin(); iter != nums.end(); iter++)
        cout << *iter << " ";
    for (int iter = 0; iter < nums.size(); iter++)
        cout << "nums[" << iter << "]=" <<nums[iter]<<" ";

    //头部增加与删减
    nums.push_front(6);//先创建元素再移动拷贝
    nums.emplace_front(6);//直接在尾部创建元素
    nums.pop_front();

    //尾部增加与删减
    nums.push_back(6);//先创建元素再移动拷贝
    nums.emplace_back(6);//直接在尾部创建元素
    nums.pop_back();

    //特定位置增加
    nums.insert(nums.begin()+2, 1);//在nums[2]插入1
    nums.insert(nums.begin()+2, 5, 3);//在nums[2]插入5个3
    nums.insert(nums.begin() + 2, nums2.begin(), nums2.end());//在nums[2]插入nums2
    nums.insert(nums.begin() + 2, { 4,5,9,8,100 });//在nums[2]插入{ 4,5,9,8,100 }
    nums.emplace(nums.begin() + 2, 300);//在nums[2]插入300 emplace只能插入单个元素 但效率比insert高

    //特定位置的删除
    nums.erase(nums.begin()+3);//删除nums[3]
    nums.erase(nums.begin(), nums.begin() + 2);//删除前两个元素

    //特定值的删除(remove()在algorithm中 不改变deque的size)
    auto iter1=remove(nums.begin(), nums.end(), 6);//移除所有为6的元素
    for (auto iter=nums.begin();iter!=iter1;iter++)//输出移除后的deque
        cout << *iter << " ";

    nums.clear();//容器清空
    nums.swap(nums2);//双向队列元素交换

    return 0;
}

(list)

#include<iostream>
#include<list>
#include<array>
#include<algorithm>
using namespace std;
bool demo(int first, int second) {
    return (first == second);
}
int main() {
    //声明
    //list<int> nums;//默认大小0
    //list<int> nums(10);//大小为10,默认值为0
    //list<int> nums(10, 1.0);//大小为10,默认值为1.0
    //list<int> nums2(nums);//复制nums
    int arr1[] = { 5,5,5,6,6,6 };
    list<int> nums(arr1, arr1 + 5);//复制arr前5元素
    array<int, 7> arr2= { 1,2,5,6,7,8 };
    list<int> nums2(arr2.begin(), arr2.begin() + 3);//复制arr前3元素
    
    //遍历
    cout << endl;
    for (int iter : nums)//顺序输出
        cout << iter << " ";
    //cout << endl;
    //for (auto iter = nums.begin(); iter != nums.end(); iter++)//顺序输出
    //    cout << *iter << " ";
    //cout << endl;
    //for (auto iter = nums.rbegin(); iter != nums.rend(); iter++)//逆向输出
    //    cout << *iter << " ";

    头部增加与删减
    nums.push_front(6);//先创建元素再移动拷贝
    nums.emplace_front(6);//直接在尾部创建元素
    nums.pop_front();

    尾部增加与删减
    nums.push_back(6);//先创建元素再移动拷贝
    nums.emplace_back(6);//直接在尾部创建元素
    nums.pop_back();

    特定位置增加
    nums.insert(nums.begin()+2, 1);//在nums[2]插入1
    nums.insert(nums.begin()+2, 5, 3);//在nums[2]插入5个3
    nums.insert(++nums.begin(), nums2.begin(), nums2.end());//在begin后1位插入nums2
    nums.insert(++nums.begin(), { 4,5,9,8,100 });//在begin后1位插入{ 4,5,9,8,100 }
    nums.emplace(++nums.begin(), 300);//在begin后1位插入300 emplace只能插入单个元素 但效率比insert高
    nums.splice(++nums.begin(), nums2);//插入整个nums2
    nums.splice(++nums.begin(), nums2, ++nums2.begin());//裁剪nums2第二个位置
    nums.splice(++nums.begin(), nums2, ++nums2.begin(), nums2.end());//第二个位置到倒数第一个位置

    特定位置的删除
    nums.erase(++nums.begin());//删除第二个元素
    nums.erase(++nums.begin(), nums.end());//删除第二个元素到最后一个元素

    nums.remove(6);//移除所有为6的元素
    nums.remove_if([](int value) {return value < 2; });//移除小于2的元素
    nums.unique();//移除相邻重复的元素
    nums.unique(demo);//移除相邻重复的元素 demo为逻辑函数

    nums.clear();//容器清空
    nums.swap(nums2);//元素交换
    nums.reverse();//元素反转
    nums.merge(nums2);//有序deque合并 原本有序 合并后也有序

    return 0;
}

(forward_list)

#include<iostream>
#include<forward_list>
#include<array>
#include<algorithm>
#include<iterator>
using namespace std;

int main() {
    //声明
    /*forward_list<int> nums;
    forward_list<int> nums(10);
    forward_list<int> nums(10, 5);
    forward_list<int> nums1(nums);*/
    int arr1[] = { 5,5,5,6,6,6 };
    forward_list<int> nums(arr1, arr1 + 5);
    array<int, 5 > arr2= {99, 84, 5, 6, 123};
    forward_list<int> nums2(arr2.begin(), arr2.end());
    
    //遍历
    cout << endl;
    for (int iter : nums)//顺序输出
        cout << iter << " ";
    //cout << endl;
    //for (auto iter = nums.begin(); iter != nums.end(); iter++)//顺序输出
    //    cout << *iter << " ";
    //cout << endl;
    
    //在头部增删
    nums.push_front(100);
    nums.emplace_front(101);
    nums.pop_front();

    //在特定位置增删
    nums.emplace_after(++nums.begin(), 100);
    nums.insert_after(++nums.begin(), 100);
    nums.erase_after(nums.begin());

  	nums.splice_after(nums.begin(), nums2);//将nums2指定位置 插入nums指定位置
    nums.splice_after(nums.begin(),nums2, ++nums2.begin());
    nums.splice_after(nums.begin(), nums2, ++nums2.begin(), nums2.end());
    nums.remove(100);//移除100
    nums.remove_if([](int value) {return value < 98; });//移除小于98
    nums.unique();//删除相邻重复元素
    
    nums.swap(nums2);//交换
    nums.merge(nums2);//合并
    nums.sort();//排序
    nums.reverse();//逆转
    nums.clear();//清空
    
	distance(nums.begin(), nums.end());//返回列表元素个数 头文件<iterator>
	
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值