Array
fixed-size strict linear sequence
1. size/max_size will always return the same result since arrays have fixed sizes.
#include <iostream>
#include <array>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
// initialization
array<int, 5> arr1;
//arr1.empty() 等于check arr1.size()==0
if(!arr1.empty()) {
cout<<"arr1 is not empty even \
though we didn't put anything inside"<<endl;
}
// go through the whole array
for(int i=0;i<arr1.size();i++){
arr1[i] = i;
// arr1.at(i) = i;
}
for(auto it=arr1.begin();it!=arr1.end();it++){
cout<<*it<<" ";
}
cout<<endl;
for(int a: arr1){
cout<<a<<" ";
}
cout<<endl;
// access elements
cout<<"the front element: "<<arr1.front()<<endl;
cout<<"the back element: "<<arr1.back()<<endl;
// array.data()
const char* ex = "exceed";
array<char, 7> arr2;
memcpy(arr2.data(), ex, 7);
cout<<arr2.data()<<endl;
for(char a: arr2) cout<<a;
cout<<endl;
// array.fill();
array<int, 5> arr3;
arr3.fill(4);
for(int a: arr3) cout<<a<<" ";
cout<<endl;
// swap
arr3.swap(arr1);
for(int a: arr3) cout<<a<<" ";
cout<<endl;
for(int a: arr1) cout<<a<<" ";
cout<<endl;
// search an element
auto found = find(arr3.begin(), arr3.end(), 1);
if(found!=arr3.end())
cout<<"found 1 at position "<<*found<<endl;
//cannot insert or delete an extra element but can replace an old element
return 0;
}
Vector
dynamic size
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
// initialization
int helper[] = {1, 3, 5};
vector<int> vec1; // empty constructor
vector<int> vec2(3, 4); // fill constructor (3 4s)
vector<int> vec3(4); // fill with default value 0s
vector<int> vec4(vec2.begin(), vec2.end()); // range constructor
vector<int> vec5(helper, helper+sizeof(helper)/sizeof(int));
vector<int> vec6(vec3); // copy constructor
vector<int> vec7 = vec3;
vector<int> vec8 = {4, 5, 6};
vector<int> vec9{1, 3, 5};
// printing
if(vec1.empty()){
cout<<"The empty vector - vec1";
for(int a: vec1) cout<<" "<<a;
cout<<endl;
}
cout<<"3 4s - vec2";
for(int a: vec2) cout<<" "<<a;
cout<<endl;
cout<<"4 0s - vec3";
for(int a: vec3) cout<<" "<<a;
cout<<endl;
cout<<"copy of vec2 - vec4";
for(int a: vec4) cout<<" "<<a;
cout<<endl;
cout<<"copy of helper - vec5";
for(int a: vec5) cout<<" "<<a;
cout<<endl;
cout<<"copy of vec3 - vec6";
for(int a: vec6) cout<<" "<<a;
cout<<endl;
cout<<"reference to vec3 - vec7";
for(int a: vec7) cout<<" "<<a;
cout<<endl;
cout<<"vec8";
for(int a: vec8) cout<<" "<<a;
cout<<endl;
cout<<"vec9";
for(int a: vec9) cout<<" "<<a;
cout<<endl;
// copying
copy(vec9.begin(), vec9.end(), vec8.begin());
cout<<"copy vec9 to vec8";
for(int a: vec8) cout<<" "<<a;
cout<<endl;
vec8.assign(vec2.begin(), vec2.end());
cout<<"copy vec2 to vec8";
for(int a: vec8) cout<<" "<<a;
cout<<endl;
// data
vector<int> myvector (5);
int* p = myvector.data();
*p = 10;
++p;
*p = 20;
p[2] = 100;
cout << "myvector contains:";
for (int i=0; i<myvector.size(); ++i)
cout << ' ' << myvector[i];
cout << '\n';
// insert at the current position and everything moves back
// && delete
myvector.push_back(99);
cout<<"push 99: ";
for(int a: myvector) cout<<a<<" ";
cout<<endl;
myvector.pop_back();
cout<<"pop: ";
for(int a: myvector) cout<<a<<" ";
cout<<endl;
myvector.insert(myvector.begin(), 11);
myvector.insert(myvector.begin(), 3, 4);
myvector.insert(myvector.end(), vec8.begin()+1, vec8.end());
cout<<"after inserting ";
for(int a: myvector) cout<<a<<" ";
cout<<endl;
myvector.erase(myvector.begin());
myvector.erase(myvector.begin(), myvector.begin()+4);
cout<<"after deleting ";
for(int a: myvector) cout<<a<<" ";
cout<<endl;
myvector.clear();
if(myvector.empty()) cout<<"myvector is empty"<<endl;
//Emplace takes the arguments necessary to construct an object in place,
//whereas insert takes (a reference to) an object.
vector<pair<char, int>> temp;
temp.emplace(temp.begin(), 'a', 3);
cout<<"after emplacing ";
for(auto a: temp) cout<<a.first<<"-"<<a.second<<" ";
cout<<endl;
// search an element
auto it = find(vec9.begin(), vec9.end(), 3);
if(it!=vec9.end()) cout<<"found "<<*it<<endl;
cout<<endl;
return 0;
}
Deque
double-ended queue
Forward_list
singly-linked list
List
doubly-linked list
#include <iostream>
#include <list>
using namespace std;
bool is_odd(const int& val) {return val%2==1;}
int main()
{
// splice
list<int> l1{1, 2, 3, 6};
list<int> l2{3, 7, 8};
cout<<"move l2 to the beginning of l1"<<endl;
l1.splice(l1.begin(), l2);
cout<<"current l1:";
for(int a: l1) cout<<" "<<a;
cout<<endl;
cout<<"current l2:";
if(l2.empty()) cout<<" l2 is empty"<<endl;
cout<<"move single element of l1 to l2"<<endl;
l2 = list<int>{3,6,78};
l2.splice(l2.begin(), l1, l1.begin());
cout<<"current l1:";
for(int a: l1) cout<<" "<<a;
cout<<endl;
cout<<"current l2:";
for(int a: l2) cout<<" "<<a;
cout<<endl;
cout<<"move a range of l1 to l2"<<endl;
auto it = l1.begin();
advance(it, 2);
l2.splice(l2.begin(), l1, l1.begin(), it);
cout<<"current l1:";
for(int a: l1) cout<<" "<<a;
cout<<endl;
cout<<"current l2:";
for(int a: l2) cout<<" "<<a;
cout<<endl;
// remove
cout<<"removing 3 from l2"<<endl;
l2.remove(3);
cout<<"current l2:";
for(int a: l2) cout<<" "<<a;
cout<<endl;
// remove_if
cout<<"remove all odds in l1"<<endl;
l1.remove_if(is_odd);
cout<<"current l1:";
for(int a: l1) cout<<" "<<a;
cout<<endl;
// unique
cout<<"remove all unique elements in l3"<<endl;
list<int> l3{1, 1, 3, 3, 5, 6, 6, 8};
l3.unique();
cout<<"current l3:";
for(int a: l3) cout<<" "<<a;
cout<<endl;
// merge
cout<<"merge l2 to l1"<<endl;
l1.merge(l2);
cout<<"current l1:";
for(int a: l1) cout<<" "<<a;
cout<<endl;
cout<<"current l2:";
if(l2.empty()) cout<<" l2 is empty"<<endl;
// sort (cannot use algorithm sort)
l1.sort();
cout<<"current l1:";
for(int a: l1) cout<<" "<<a;
cout<<endl;
// reverse
l1.reverse();
cout<<"current l1:";
for(int a: l1) cout<<" "<<a;
cout<<endl;
return 0;
}