容器库(3)-std::deque

std::deque是有索引的序列容器,它允许在它的首尾两端快速插入及删除元素,和vector不同的是,deque底层的内存不是连续的。

本文章的代码库:

https://gitee.com/gamestorm577/CppStd

成员函数

构造、赋值和析构

构造函数

可以用元素或者另一个deque来构造deque。代码示例:

std::vector<float> vec(10, 5.f);

std::deque<float> d1;
std::deque<float> d2(3, 5.5f);
std::deque<float> d3(vec.begin() + 1, vec.begin() + 5);
std::deque<float> d4(d3);
std::deque<float> tmp(d2);
std::deque<float> d5(std::move(tmp));
std::deque<float> d6{1.f, 2.f, 3.f, 4.f, 5.f};

std::cout << "d1 size = " << d1.size() << std::endl;
std::cout << "d2 size = " << d2.size() << std::endl;
std::cout << "d3 size = " << d3.size() << std::endl;
std::cout << "d4 size = " << d4.size() << std::endl;
std::cout << "d5 size = " << d5.size() << std::endl;
std::cout << "d6 size = " << d6.size() << std::endl;

输出结果:

d1 size = 0
d2 size = 3
d3 size = 4
d4 size = 4
d5 size = 3
d6 size = 5

析构函数

销毁deque时,会从左到右依次调用元素的析构函数。代码示例:

struct MyStruct
{
    ~MyStruct()
    {
        std::cout << "~MyStruct Index = " << Index << std::endl;
    }
    
    int Index = 0;
};

std::deque<MyStruct> d(3);
d[0].Index = 0;
d[1].Index = 1;
d[2].Index = 2;

输出结果:

~MyStruct Index = 0
~MyStruct Index = 1
~MyStruct Index = 2

赋值函数

可以给另一个deque或者元素列表给deque赋值。代码示例:

std::deque<float> tmp(10, 5.5f);
std::deque<float> d1;
std::deque<float> d2;
std::deque<float> d3;

d1 = tmp;
d2 = std::move(tmp);
d3 = {1.f, 2.f, 3.f};
std::cout << "d1 size = " << d1.size() << std::endl;
std::cout << "d2 size = " << d2.size() << std::endl;
std::cout << "d3 size = " << d3.size() << std::endl;

输出结果:

d1 size = 10
d2 size = 10
d3 size = 3

assign

将值赋值给deque,参数可以是元素、迭代器或者元素列表。代码示例:

std::deque<float> tmp(10, 5.5f);
std::deque<float> d;

d.assign(5, 4.f);
std::cout << "d size = " << d.size() << std::endl;
d.assign(tmp.begin(), tmp.begin() + 8);
std::cout << "d size = " << d.size() << std::endl;
d.assign({1.f, 2.f, 3.f});
std::cout << "d size = " << d.size() << std::endl;

输出结果:

d size = 5
d size = 8
d size = 3

元素访问

at

返回指定位置的元素的引用,如果超出边界,会抛出异常。代码示例:

std::deque<float> d = {1.f, 2.f, 3.f};
d.at(1) = 5.f;
std::cout << "d at 1 is: " << d.at(1) << std::endl;

try
{
    d.at(10) = 1.f;
}
catch (std::out_of_range& exc)
{
    std::cout << "error: " <<  exc.what() << std::endl;
}

输出结果:

d at 1 is: 5
error: deque

operator[]

返回指定位置的元素的引用,没有边界检查。代码示例:

std::deque<float> d = {1.f, 2.f, 3.f};
d[1] = 5.f;
std::cout << "d at 1 is: " << d[1] << std::endl;

输出结果:

d at 1 is: 5

front

返回首个元素的引用,要求deque不为空。代码示例:

std::deque<float> d = {1.f, 2.f, 3.f};
d.front() = 5.f;
std::cout << "d front is: " << d.front() << std::endl;

输出结果:

d front is: 5

back

返回最后一个元素的引用,要求array不为空。代码示例:

std::deque<float> d = {1.f, 2.f, 3.f};
d.back() = 5.f;
std::cout << "d back is: " << d.back() << std::endl;

输出结果:

d back is: 5

迭代器

示例代码:

std::deque<float> d = {1.f, 2.f, 3.f, 4.f};
for (auto iter = d.begin(); iter != d.end(); ++iter)
{
    *iter += 10.1f;
}

for (auto iter = d.cbegin(); iter != d.cend(); ++iter)
{
    std::cout << "num = " << *iter << std::endl;
}

输出结果:

num = 11.1
num = 12.1
num = 13.1
num = 14.1

容量

empty

检查容器的元素是否为空。代码示例:

std::deque<float> d1;
std::deque<float> d2 = {1.f, 2.f};
std::cout << std::boolalpha;
std::cout << "d1 empty: " << d1.empty() << std::endl;
std::cout << "d2 empty: " << d2.empty() << std::endl;

输出结果:

d1 empty: true
d2 empty: false

size

返回deque中元素的个数。代码示例:

std::deque<float> d1;
std::deque<float> d2 = {1.f, 2.f};
std::cout << "d1 size = " << d1.size() << std::endl;
std::cout << "d2 size = " << d2.size() << std::endl;

输出结果:

d1 size = 0
d2 size = 2

max_size

返回系统支持的deque元素最大个数。代码示例:

std::deque<float> d1;
std::deque<double> d2;
std::cout << "d1 max size = " << d1.max_size() << std::endl;
std::cout << "d2 max size = " << d2.max_size() << std::endl;

可能的输出结果:

d1 max size = 4611686018427387903
d2 max size = 2305843009213693951

shrink_to_fit

请求删除空闲的空间,具体是否移除依赖于实现。

修改器

clear

清除所有的元素。代码示例:

std::deque<float> d(5, 4.f);
std::cout << "d size = " << d.size() << std::endl;
d.clear();
std::cout << "d size = " << d.size() << std::endl;

输出结果:

d size = 5
d size = 0

insert

在指定位置插入元素,可以插入元素、元素列表或者迭代器。代码示例:

auto print_func = [](const std::deque<float>& deq) -> void
{
    for (auto i : deq)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;
};

std::vector<float> tmp = {11.1f, 12.1f, 13.1f};

std::deque<float> d(3, 1.1f);
d.insert(d.begin() + 1, 5.5f);
print_func(d);
d.insert(d.begin() + 2, 5, 4.1f);
print_func(d);
d.insert(d.begin() + 4, tmp.begin() + 1, tmp.end());
print_func(d);
d.insert(d.begin() + 1, {20.1f, 20.2f});
print_func(d);

输出结果:

1.1 5.5 1.1 1.1 
1.1 5.5 4.1 4.1 4.1 4.1 4.1 1.1 1.1 
1.1 5.5 4.1 4.1 12.1 13.1 4.1 4.1 4.1 1.1 1.1 
1.1 20.1 20.2 5.5 4.1 4.1 12.1 13.1 4.1 4.1 4.1 1.1 1.1 

emplace

在指定位置构造一个元素。代码示例:

struct MyStruct
{
    MyStruct(float, int)
    {
        std::cout << "MyStruct" << std::endl;
    }
};

std::deque<MyStruct> d;
d.emplace(d.begin(), 1.1f, 4);

输出结果:

MyStruct

erase

删除指定位置的元素。代码示例:

auto print_func = [](const std::deque<float>& deq) -> void
{
    for (auto i : deq)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;
};

std::deque<float> deq{1.5, 2.5, 3.5, 4.5, 5.5f, 6.5f, 7.5f, 8.5f};
print_func(deq);
deq.erase(deq.cbegin() + 1);
print_func(deq);
deq.erase(deq.cbegin() + 4, deq.cend() - 1);
print_func(deq);

输出结果:

1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 
1.5 3.5 4.5 5.5 6.5 7.5 8.5 
1.5 3.5 4.5 5.5 8.5

push_back

在deque末尾添加一个元素。示例代码:

std::vector<float> deq(3, 4.f);
deq.push_back(1.f);
std::cout << "deq size is: " << deq.size() << std::endl;

输出结果:

deq size is: 4

emplace_back

在deque末尾构造一个元素。示例代码:

struct MyStruct
{
    MyStruct(float, int)
    {
        std::cout << "MyStruct" << std::endl;
    }
};

std::deque<MyStruct> deq;
deq.emplace_back(1.f, 4);

输出结果:

MyStruct

pop_back

移除末尾的元素,需要deque不为空。示例代码:

std::deque<float> deq = {1.1f, 2.1f, 3.1f};
std::cout << "deq back is: " << deq.back() << std::endl;
deq.pop_back();
std::cout << "deq back is: " << deq.back() << std::endl;

输出结果:

deq back is: 3.1
deq back is: 2.1

push_front

在deque初始位置插入一个元素。示例代码:

std::deque<float> deq = {1.1f, 2.1f, 3.1f};
std::cout << "deq front is: " << deq.front() << std::endl;
deq.push_front(4.5f);
std::cout << "deq front is: " << deq.front() << std::endl;

输出结果:

deq front is: 1.1
deq front is: 4.5

emplace_front

在deque初始位置构造一个元素。示例代码:

struct MyStruct
{
    MyStruct(float num1, int num2)
    {
        std::cout << "MyStruct" << std::endl;
    }
};

std::deque<MyStruct> deq;
deq.emplace_front(1.f, 2);

输出结果:

MyStruct

pop_front

移除deque的首个元素。代码示例:

std::deque<float> deq{1.1f, 2.1f, 3.1f};
std::cout << "deq front is: " << deq.front() << std::endl;
deq.pop_front();
std::cout << "deq front is: " << deq.front() << std::endl;

输出结果:

deq front is: 1.1
deq front is: 2.1

resize

重新设置元素的个数。代码示例:

std::deque<float> deq(5, 1.4f);
std::cout << "size = " << deq.size() << std::endl;
deq.resize(20);
std::cout << "size = " << deq.size() << std::endl;
deq.resize(3);
std::cout << "size = " << deq.size() << std::endl;

输出结果:

size = 5
size = 20
size = 3

swap

交换两个deque的元素内容。代码示例:

非成员函数

比较运算符

operator==,!=,<,<=,>,>=用于比较两个deque。代码示例:

std::deque<int> deq1 = {1, 2, 3, 4};
std::deque<int> deq2 = {1, 2, 3};
std::cout << std::boolalpha;
std::cout << "deq1 == deq2: " << (deq1 == deq2) << std::endl;
std::cout << "deq1 != deq2: " << (deq1 != deq2) << std::endl;
std::cout << "deq1 <  deq2: " << (deq1 < deq2) << std::endl;
std::cout << "deq1 <= deq2: " << (deq1 <= deq2) << std::endl;
std::cout << "deq1 >  deq2: " << (deq1 > deq2) << std::endl;
std::cout << "deq1 >= deq2: " << (deq1 >= deq2) << std::endl;

输出结果:

deq1 == deq2: false
deq1 != deq2: true
deq1 <  deq2: false
deq1 <= deq2: false
deq1 >  deq2: true
deq1 >= deq2: true

std::swap

交换两个deque的元素内容。代码示例:

std::deque<int> deq1 = {1, 2, 3, 4};
std::deque<int> deq2 = {1, 2, 3};
std::swap(deq1, deq2);
std::cout << "deq1 size = " << deq1.size() << std::endl;
std::cout << "deq2 size = " << deq2.size() << std::endl;

输出结果:

deq1 size = 3
deq2 size = 4

std::erase、std::erase_if

erase删除等于指定值的元素,erase_if删除满足要求的元素。代码示例:

auto print_func = [](const std::deque<int> vec) -> void
{
    for (auto i : vec)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;
};

std::deque<int> vec = {1, 2, 2, 3, 4, 4, 4, 5, 8, 8, 9, 9, 9};
print_func(vec);

std::erase(vec, 4);
print_func(vec);

std::erase_if(vec,
              [](int x) -> bool
              {
                  return x > 7;
              });
print_func(vec);

输出结果:

1 2 2 3 4 4 4 5 8 8 9 9 9 
1 2 2 3 5 8 8 9 9 9 
1 2 2 3 5 

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值