std::deque是有索引的序列容器,它允许在它的首尾两端快速插入及删除元素,和vector不同的是,deque底层的内存不是连续的。
本文章的代码库:
https://gitee.com/gamestorm577/CppStd
可以用元素或者另一个deque来构造deque。代码示例:
std::vector vec(10, 5.f);
std::deque d1;
std::deque d2(3, 5.5f);
std::deque d3(vec.begin() + 1, vec.begin() + 5);
std::deque d4(d3);
std::deque tmp(d2);
std::deque d5(std::move(tmp));
std::deque 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 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 tmp(10, 5.5f);
std::deque d1;
std::deque d2;
std::deque 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
将值赋值给deque,参数可以是元素、迭代器或者元素列表。代码示例:
std::deque tmp(10, 5.5f);
std::deque 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
返回指定位置的元素的引用,如果超出边界,会抛出异常。代码示例:
std::deque 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
返回指定位置的元素的引用,没有边界检查。代码示例:
std::deque 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
返回首个元素的引用,要求deque不为空。代码示例:
std::deque d = {1.f, 2.f, 3.f};
d.front() = 5.f;
std::cout << "d front is: " << d.front() << std::endl;
输出结果:
d front is: 5
返回最后一个元素的引用,要求array不为空。代码示例:
std::deque 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 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
检查容器的元素是否为空。代码示例:
std::deque d1;
std::deque 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
返回deque中元素的个数。代码示例:
std::deque d1;
std::deque 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
返回系统支持的deque元素最大个数。代码示例:
std::deque d1;
std::deque 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
请求删除空闲的空间,具体是否移除依赖于实现。
清除所有的元素。代码示例:
std::deque 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
在指定位置插入元素,可以插入元素、元素列表或者迭代器。代码示例:
auto print_func = [](const std::deque& deq) -> void
{
for (auto i : deq)
{
std::cout << i << " ";
}
std::cout << std::endl;
};
std::vector tmp = {11.1f, 12.1f, 13.1f};
std::deque 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
在指定位置构造一个元素。代码示例:
struct MyStruct
{
MyStruct(float, int)
{
std::cout << "MyStruct" << std::endl;
}
};
std::deque d;
d.emplace(d.begin(), 1.1f, 4);
输出结果:
MyStruct
删除指定位置的元素。代码示例:
auto print_func = [](const std::deque& deq) -> void
{
for (auto i : deq)
{
std::cout << i << " ";
}
std::cout << std::endl;
};
std::deque 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
在deque末尾添加一个元素。示例代码:
std::vector deq(3, 4.f);
deq.push_back(1.f);
std::cout << "deq size is: " << deq.size() << std::endl;
输出结果:
deq size is: 4
在deque末尾构造一个元素。示例代码:
struct MyStruct
{
MyStruct(float, int)
{
std::cout << "MyStruct" << std::endl;
}
};
std::deque deq;
deq.emplace_back(1.f, 4);
输出结果:
MyStruct
移除末尾的元素,需要deque不为空。示例代码:
std::deque 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
在deque初始位置插入一个元素。示例代码:
std::deque 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
在deque初始位置构造一个元素。示例代码:
struct MyStruct
{
MyStruct(float num1, int num2)
{
std::cout << "MyStruct" << std::endl;
}
};
std::deque deq;
deq.emplace_front(1.f, 2);
输出结果:
MyStruct
移除deque的首个元素。代码示例:
std::deque 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
重新设置元素的个数。代码示例:
std::deque 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
交换两个deque的元素内容。代码示例:
operator==,!=,<,<=,>,>=用于比较两个deque。代码示例:
std::deque deq1 = {1, 2, 3, 4};
std::deque 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
交换两个deque的元素内容。代码示例:
std::deque deq1 = {1, 2, 3, 4};
std::deque 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
erase删除等于指定值的元素,erase_if删除满足要求的元素。代码示例:
auto print_func = [](const std::deque vec) -> void
{
for (auto i : vec)
{
std::cout << i << " ";
}
std::cout << std::endl;
};
std::deque 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