概述
操作总结
异常处理
deque和vector功能上的对比,但是接口是一样的
实例
构造
std::deque::deque
#include <deque>
#include <string>
#include <iostream>
template<typename T>
std::ostream& operator<<(std::ostream& s, const std::deque<T>& v)
{
s.put('[');
char comma[3] = {'\0', ' ', '\0'};
for (const auto& e : v) {
s << comma << e;
comma[0] = ',';
}
return s << ']';
}
int main()
{
// C++11 初始化器列表语法:
std::deque<std::string> words1 {"the", "frogurt", "is", "also", "cursed"};
std::cout << "words1: " << words1 << '\n';
// words2 == words1
std::deque<std::string> words2(words1.begin(), words1.end());
std::cout << "words2: " << words2 << '\n';
// words3 == words1
std::deque<std::string> words3(words1);
std::cout << "words3: " << words3 << '\n';
// words4 为 {"Mo", "Mo", "Mo", "Mo", "Mo"}
std::deque<std::string> words4(5, "Mo");
std::cout << "words4: " << words4 << '\n';
}
std::deque::assign
#include <deque>
#include <iostream>
int main()
{
std::deque<char> characters;
characters.assign(5, 'a');
for (char c : characters) {
std::cout << c << ' ';
}
characters.assign({'\n', 'C', '+', '+', '1', '1', '\n'});
for (char c : characters) {
std::cout << c;
}
}
元素访问
std::deque::at
#include <iostream>
#include <deque>
int main()
{
std::deque<int> data = { 1, 2, 4, 5, 5, 6 };
// Set element 1
data.at(1) = 88;
// Read element 2
std::cout << "Element at index 2 has value " << data.at(2) << '\n';
std::cout << "data size = " << data.size() << '\n';
try {
// Set element 6
data.at(6) = 666;
} catch (std::out_of_range const& exc) {
std::cout << exc.what() << '\n';
}
// Print final values
std::cout << "data:";
for (int elem : data)
std::cout << " " << elem;
std::cout << '\n';
}
std::deque::operator[]
返回位于指定位置 pos
的元素的引用。不进行边界检查。通过此运算符访问不存在的元素是未定义行为。
#include <deque>
#include <iostream>
int main()
{
std::deque<int> numbers {2, 4, 6, 8};
std::cout << "Second element: " << numbers[1] << '\n';
numbers[0] = 5;
std::cout << "All numbers:";
for (auto i : numbers) {
std::cout << ' ' << i;
}
std::cout << '\n';
}
std::deque::front、std::deque::back
std::deque::front
std::deque::back
#include <deque>
#include <iostream>
int main()
{
std::deque<char> letters {'o', 'm', 'g', 'w', 't', 'f'};
if (!letters.empty()) {
std::cout << "The first character is: " << letters.front() << '\n';
std::cout << "The last character is: " << letters.back() << '\n';
}
}
容量
std::deque::empty
#include <deque>
#include <iostream>
int main()
{
std::deque<int> numbers;
std::cout << "Initially, numbers.empty(): " << numbers.empty() << '\n';
numbers.push_back(42);
numbers.push_back(13317);
std::cout << "After adding elements, numbers.empty(): " << numbers.empty() << '\n';
}
std::deque::size
#include <deque>
#include <iostream>
int main()
{
std::deque<int> nums {1, 3, 5, 7};
std::cout << "nums contains " << nums.size() << " elements.\n";
}
std::deque::max_size
#include <iostream>
#include <deque>
int main()
{
std::deque<char> s;
std::cout << "Maximum size of a 'deque' is " << s.max_size() << "\n";
}
std::deque::shrink_to_fit
#include <deque>
int main() {
std::deque<int> nums(1000, 42);
nums.push_front(1);
nums.pop_front();
nums.clear();
// nums 现在不含项目,但它仍保有分配的内存。
// 调用 shrink_to_fit 可能会释放任何不使用的内存。
nums.shrink_to_fit();
}
修改器
std::deque::clear
#include <algorithm>
#include <iostream>
#include <deque>
int main()
{
std::deque<int> container{1, 2, 3};
auto print = [](const int& n) { std::cout << " " << n; };
std::cout << "Before clear:";
std::for_each(container.begin(), container.end(), print);
std::cout << "\nSize=" << container.size() << '\n';
std::cout << "Clear\n";
container.clear();
std::cout << "After clear:";
std::for_each(container.begin(), container.end(), print);
std::cout << "\nSize=" << container.size() << '\n';
}
std :: deque :: insert
作用:插入元素到指定位置
// inserting into a deque
#include <iostream>
#include <deque>
#include <vector>
int main ()
{
std::deque<int> mydeque;
// set some initial values:
for (int i=1; i<6; i++) mydeque.push_back(i); // 1 2 3 4 5
std::deque<int>::iterator it = mydeque.begin();
++it;
it = mydeque.insert (it,10); // 1 10 2 3 4 5
// "it" now points to the newly inserted 10
mydeque.insert (it,2,20); // 1 20 20 10 2 3 4 5
// "it" no longer valid!
it = mydeque.begin()+2;
std::vector<int> myvector (2,30);
mydeque.insert (it,myvector.begin(),myvector.end());
// 1 20 30 30 20 10 2 3 4 5
std::cout << "mydeque contains:";
for (it=mydeque.begin(); it!=mydeque.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
std :: deque :: emplace
作用:构造并插入元素到指定位置
// deque::emplace
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque = {10,20,30};
auto it = mydeque.emplace ( mydeque.begin()+1, 100 );
mydeque.emplace ( it, 200 );
mydeque.emplace ( mydeque.end(), 300 );
std::cout << "mydeque contains:";
for (auto& x: mydeque)
std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
#include <iostream>
#include <string>
#include <deque>
struct A {
std::string s;
A(std::string str) : s(std::move(str)) { std::cout << " constructed\n"; }
A(const A& o) : s(o.s) { std::cout << " copy constructed\n"; }
A(A&& o) : s(std::move(o.s)) { std::cout << " move constructed\n"; }
A& operator=(const A& other) {
s = other.s;
std::cout << " copy assigned\n";
return *this;
}
A& operator=(A&& other) {
s = std::move(other.s);
std::cout << " move assigned\n";
return *this;
}
};
int main()
{
std::deque<A> container;
std::cout << "construct 2 times A:\n";
A two { "two" };
A three { "three" };
std::cout << "emplace:\n";
container.emplace(container.end(), "one");
std::cout << "emplace with A&:\n";
container.emplace(container.end(), two);
std::cout << "emplace with A&&:\n";
container.emplace(container.end(), std::move(three));
std::cout << "content:\n";
for (const auto& obj : container)
std::cout << ' ' << obj.s;
std::cout << '\n';
}
std::deque::emplace_front
在开始时构造并插入元素
// deque::emplace_from
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque = {10,20,30};
mydeque.emplace_front (111);
mydeque.emplace_front (222);
std::cout << "mydeque contains:";
for (auto& x: mydeque)
std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
std::deque::emplace_back
// deque::emplace_from
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque = {10,20,30};
mydeque.emplace_back (100);
mydeque.emplace_back (200);
std::cout << "mydeque contains:";
for (auto& x: mydeque)
std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
#include <deque>
#include <string>
#include <iostream>
struct President
{
std::string name;
std::string country;
int year;
President(std::string p_name, std::string p_country, int p_year)
: name(std::move(p_name)), country(std::move(p_country)), year(p_year)
{
std::cout << "I am being constructed.\n";
}
President(President&& other)
: name(std::move(other.name)), country(std::move(other.country)), year(other.year)
{
std::cout << "I am being moved.\n";
}
President& operator=(const President& other) = default;
};
int main()
{
std::deque<President> elections;
std::cout << "emplace_back:\n";
elections.emplace_back("Nelson Mandela", "South Africa", 1994);
std::deque<President> reElections;
std::cout << "\npush_back:\n";
reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));
std::cout << "\nContents:\n";
for (President const& president: elections) {
std::cout << president.name << " was elected president of "
<< president.country << " in " << president.year << ".\n";
}
for (President const& president: reElections) {
std::cout << president.name << " was re-elected president of "
<< president.country << " in " << president.year << ".\n";
}
}
std::deque::push_front
void push_front(const value_type&val);
void push_front(value_type && val);
在双端队列容器的当前位置的第一个元素之前插入一个新元素。val的内容被复制(或移动)到插入的元素。
// deque::push_front
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque (2,100); // two ints with a value of 100
mydeque.push_front (200);
mydeque.push_front (300);
std::cout << "mydeque contains:";
for (std::deque<int>::iterator it = mydeque.begin(); it != mydeque.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
std::deque::push_back
#include <deque>
#include <iostream>
#include <iomanip>
int main()
{
std::deque<std::string> letters;
letters.push_back("abc");
std::string s = "def";
letters.push_back(std::move(s));
std::cout << "deque holds: ";
for (auto&& i : letters) std::cout << std::quoted(i) << ' ';
std::cout << "\nMoved-from string holds " << std::quoted(s) << '\n';
}
std::deque::pop_front
// deque::emplace_from
#include <iostream>
#include <deque>
int main ()
{
std::deque<int> mydeque = {10,20,30};
mydeque.emplace_front (111);
mydeque.emplace_front (222);
std::cout << "mydeque contains:";
for (auto& x: mydeque)
std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
std::deque::pop_back
#include <deque>
#include <iostream>
template<class T>
void print(T const & xs)
{
std::cout << "[ ";
for(auto && x : xs) {
std::cout << x << ' ';
}
std::cout << "]\n";
}
int main()
{
std::deque<int> numbers;
print(numbers);
numbers.push_back(5);
numbers.push_back(3);
numbers.push_back(4);
print(numbers);
numbers.pop_back();
print(numbers);
}
std::deque::erase
作用:擦除指定位置的元素
#include <deque>
#include <iostream>
int main( )
{
std::deque<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto &i : c) {
std::cout << i << " ";
}
std::cout << '\n';
c.erase(c.begin());
for (auto &i : c) {
std::cout << i << " ";
}
std::cout << '\n';
c.erase(c.begin()+2, c.begin()+5);
for (auto &i : c) {
std::cout << i << " ";
}
std::cout << '\n';
}
std::deque::resize
#include <iostream>
#include <deque>
int main()
{
std::deque<int> c = {1, 2, 3};
std::cout << "The deque holds: ";
for(auto& el: c) std::cout << el << ' ';
std::cout << '\n';
c.resize(5);
std::cout << "After resize up to 5: ";
for(auto& el: c) std::cout << el << ' ';
std::cout << '\n';
c.resize(2);
std::cout << "After resize down to 2: ";
for(auto& el: c) std::cout << el << ' ';
std::cout << '\n';
}
std::deque::swap
#include <iostream>
#include <deque>
template<class Os, class Co> Os& operator<<(Os& os, const Co& co) {
os << "{";
for (auto const& i : co) { os << ' ' << i; }
return os << " } ";
}
int main()
{
std::deque<int> a1{1, 2, 3}, a2{4, 5};
auto it1 = std::next(a1.begin());
auto it2 = std::next(a2.begin());
int& ref1 = a1.front();
int& ref2 = a2.front();
std::cout << a1 << a2 << *it1 << ' ' << *it2 << ' ' << ref1 << ' ' << ref2 << '\n';
a1.swap(a2);
std::cout << a1 << a2 << *it1 << ' ' << *it2 << ' ' << ref1 << ' ' << ref2 << '\n';
// 注意交换后迭代器与引用保持与其原来的元素关联,例如指向 'a1' 中值为 2 的元素的 it1 仍指向同一元素,
// 尽管此元素被移动到 'a2' 中。
}
其他
==,!=,<,<=,>,>=,<=>
作用:按照字典顺序比较 deque 中的值
#include <iostream>
#include <deque>
int main()
{
std::deque<int> alice{1, 2, 3};
std::deque<int> bob{7, 8, 9, 10};
std::deque<int> eve{1, 2, 3};
std::cout << std::boolalpha;
// 比较不相等的容器
std::cout << "alice == bob returns " << (alice == bob) << '\n';
std::cout << "alice != bob returns " << (alice != bob) << '\n';
std::cout << "alice < bob returns " << (alice < bob) << '\n';
std::cout << "alice <= bob returns " << (alice <= bob) << '\n';
std::cout << "alice > bob returns " << (alice > bob) << '\n';
std::cout << "alice >= bob returns " << (alice >= bob) << '\n';
std::cout << '\n';
// 比较相等的容器
std::cout << "alice == eve returns " << (alice == eve) << '\n';
std::cout << "alice != eve returns " << (alice != eve) << '\n';
std::cout << "alice < eve returns " << (alice < eve) << '\n';
std::cout << "alice <= eve returns " << (alice <= eve) << '\n';
std::cout << "alice > eve returns " << (alice > eve) << '\n';
std::cout << "alice >= eve returns " << (alice >= eve) << '\n';
}
std::swap(std::deque)
#include <algorithm>
#include <iostream>
#include <deque>
int main()
{
std::deque<int> alice{1, 2, 3};
std::deque<int> bob{7, 8, 9, 10};
auto print = [](const int& n) { std::cout << " " << n; };
// 打印交换前的状态
std::cout << "alice:";
std::for_each(alice.begin(), alice.end(), print);
std::cout << '\n';
std::cout << "bob :";
std::for_each(bob.begin(), bob.end(), print);
std::cout << '\n';
std::cout << "-- SWAP\n";
std::swap(alice,bob);
// 打印交换后的状态
std::cout << "alice:";
std::for_each(alice.begin(), alice.end(), print);
std::cout << '\n';
std::cout << "bob :";
std::for_each(bob.begin(), bob.end(), print);
std::cout << '\n';
}
std::erase, std::erase_if (std::deque)
#include <iostream>
#include <numeric>
#include <deque>
void print_container(const std::deque<char>& c)
{
for (auto x : c) {
std::cout << x << ' ';
}
std::cout << '\n';
}
int main()
{
std::deque<char> cnt(10);
std::iota(cnt.begin(), cnt.end(), '0');
std::cout << "Init:\n";
print_container(cnt);
auto erased = std::erase(cnt, '3');
std::cout << "Erase \'3\':\n";
print_container(cnt);
std::erase_if(cnt, [](char x) { return (x - '0') % 2 == 0; });
std::cout << "Erase all even numbers:\n";
print_container(cnt);
std::cout << "In all " << erased << " even numbers were erased.\n";
}