Sequence Containers C++

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;
}

run the above code here

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;
}

run the above code here

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;
}

run the above code here

猜你喜欢

转载自blog.csdn.net/real_lisa/article/details/83326186
今日推荐