JHHK

欢迎来到我的个人网站
行者常至 为者常成

19、array

目录

C数组

void array_constructor_test(){
    {
        double balance0[10];
        double balance1[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
        double balance2[]  = {1000.0, 2.0, 3.4, 7.0, 50.0};
        balance0[4] = 50.0;
    }
    
    
    {
        //n 是一个包含 10 个整数的数组
        int n[ 10 ];
         
        //初始化数组元素
        for ( int i = 0; i < 10; i++ ){
            n[ i ] = i + 100; // 设置元素 i 为 i + 100
        }
       
        
        // 输出数组中每个元素的值
        cout << "Element" << setw( 13 ) << "Value" << endl;
        for ( int j = 0; j < 10; j++ ){
            cout << setw( 7 )<< j << setw( 13 ) << n[ j ] << endl;
        }
    }
}

vector

vector : vector和built-in数组类似,拥有一段连续的内存空间,能非常好的支持随即存取,
即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,
另外,当插入较多的元素后,预留内存空间可能不够,需要重新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。
这些影响了vector的效率,但是实际上用的最多的还是vector容器,建议大多数时候使用vector效率一般是不错的

一、构造函数

void vector_constructor(){
    //vector():创建一个空vector
    vector<int> vec0 =vector<int>();
    
    
    //vector(int nSize):创建一个vector,元素个数为nSize
    vector<int> vec1 = vector<int>(10);
    vector<int> vec1_2(10);
    
    
    //vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
    vector<int> vec2 = vector<int>(10,1);
    vector<int> vec2_2(10,1);
    
    
    //vector(const vector&):复制构造函数
    vector<int> vec3 = vector<int>(vec2);
    vector<int> vec3_2(vec2);
    
    
    //vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
    vector<int> vec4 = vector<int>(vec2.begin(),vec2.end());
    vector<int> vec4_2(vec2.begin(),vec2.end());

    for (int i = 0; i<vec4_2.size(); i++) {
        cout<<"vec4["<<i<<"] = "<< vec4[i]<<endl;
    }
    
    
    //直接初始化
    vector<int> vec5{ 4, 7, 9, 1, 2, 5 };

}

二、增删改查交换

void vector_zengShanGaiCha(){
   
    //增
    cout<<"------------------增--------------------"<<endl;
    {
        vector<int> vec(3,0),vec1(2,9);
        
        
        //void push_back(const T& x):向量尾部增加一个元素X
        vec.push_back(3);
        
        //iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
        vec.insert(vec.end(), 4);
        
        //iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
        vec.insert(vec.end(), 2,5);
        
        //iterator insert(iterator it,const_iterator first,const_iterator last):
        //向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
        vec.insert(vec.end(), vec1.begin(),vec1.end());
        
        for (int i = 0; i<vec.size(); i++) {
            cout<<"vec["<<i<<"] = "<<vec[i]<<endl;
        }
    }
    
    
    //删
    cout<<"------------------删--------------------"<<endl;
    {
        vector<int> vec(5);
        for (int i = 0; i<vec.size(); i++) {
            vec[i] = i;
        }
        
        //iterator erase(iterator it):删除向量中迭代器指向元素
        vec.erase(vec.end()-1);
        
        //iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
        vec.erase(vec.end()-2,vec.end());
        
        //void pop_back():删除向量中最后一个元素
        vec.pop_back();
        
        //void clear():清空向量中所有元素
        vec.clear();
        
        for (int i = 0; i<vec.size(); i++) {
            cout<<"vec["<<i<<"] = "<<vec[i]<<endl;
        }
    }
    
    
    //改
    cout<<"------------------改--------------------"<<endl;
    {
        vector<int> vec(3,1);
        vector<int> vec1(4,1);

        
        //vec.assign(n,T(val)) 将 vec中元素变为n个T(val)
        vec.assign(2, 5);
        
        //l1.assign(l2.begin(),l2.end())将l2中的从l2.begin()到l2.end()之间的数值赋值给l1
        vec.assign(vec1.begin(), vec1.end());
        
        for (int i = 0; i<vec.size(); i++) {
            cout<<"vec["<<i<<"] = "<<vec[i]<<endl;
        }
    }

    
    //查
    cout<<"------------------查--------------------"<<endl;
    {
        vector<int> vec(3,1);
        
        //返回元素的引用
        int i0 = vec.at(0);
        int ifront = vec.front();
        int iback = vec.back();
        cout<<i0<<ifront<<iback<<endl;
        
        //返回向量头尾指针
        vector<int>::iterator itBegin = vec.begin();
        vector<int>::iterator itEnd = vec.end();
        cout<<*itBegin<<*(itEnd-1)<<endl;
        
        vector<int> v{ 4, 7, 9, 1, 2, 5 };
        int key = 2;
        
        //count判断
        if (count(v.begin(), v.end(), key)){
            cout << "Element found" << endl;
        }else{
            cout << "Element NOT found" << endl;
        }
        
        
        //find进行判断
        if (find(v.begin(), v.end(), key) != v.end()){
            cout << "Element found" << endl;
        }else{
            cout << "Element NOT found" << endl;
        }
    }
    
    
    //交换
    cout<<"------------------交换--------------------"<<endl;
    {
        
        //void swap(vector&):交换两个同类型向量的数据
        vector<int> vec0{ 1,2,3};
        vector<int> vec1{ 4,5,6};
        
        //交换方式一
        vec0.swap(vec1);
        for (auto it = vec0.begin(); it<vec0.end(); it++) {
            cout<<"vec[i] = "<< *it << endl;
        }
        for (auto it = vec1.begin(); it<vec1.end(); it++) {
            cout<<"vec[i] = "<< *it << endl;
        }

        
        //交换方式二
        swap(vec0,vec1);
        for (auto it = vec0.begin(); it<vec0.end(); it++) {
            cout<<"vec[i] = "<< *it << endl;
        }
        for (auto it = vec1.begin(); it<vec1.end(); it++) {
            cout<<"vec[i] = "<< *it << endl;
        }
    }  
}

三、大小相关

void vector_size(){
    vector<int> vec(10);
    
    //size 当前使用数据的大小
    cout<<"size = "<<vec.size()<<endl;
    
    //capacity 当前vector分配的大小
    cout<<"capacity = "<<vec.capacity()<<endl;
    
    //max_size 得到vector最大可以是多大
    cout<<"max_size = "<<vec.max_size()<<endl;
    
    //empty
    cout<<"empty = "<<vec.empty()<<endl;
    
    //重新设置该容器的大小
    vec.resize(5);
    
}

四、排序

bool compare(int a,int b){
    return b - a;
}

void vector_sort(){
    vector<int> vec;
    vec.push_back(3);
    vec.push_back(1);
    vec.push_back(2);
    for (int i = 0; i<vec.size(); i++) {
        cout<<"vec["<<i<<"] = "<<vec[i]<<endl;
    }
    
    
    cout<<"-------------反转后-------------"<<endl;
    reverse(vec.begin(), vec.end());
    for (int i = 0; i<vec.size(); i++) {
        cout<<"vec["<<i<<"] = "<<vec[i]<<endl;
    }

    
    cout<<"-------------排序后(升)-------------"<<endl;
    //sort需要头文件  #include <algorithm>
    sort(vec.begin(),vec.end());
    for (int i = 0; i<vec.size(); i++) {
        cout<<"vec["<<i<<"] = "<<vec[i]<<endl;
    }
    
    cout<<"-------------排序后(将)-------------"<<endl;
    //通过自动以比较方法来进行排序
    sort(vec.begin(), vec.end(), compare);
    for (int i = 0; i<vec.size(); i++) {
        cout<<"vec["<<i<<"] = "<<vec[i]<<endl;
    }
}

五、遍历方式

void vector_enum(){
    vector<string> vec = {"c++","java","oc"};

    //遍历方式一
//    vector<string>::iterator iter;
//    for (iter = vec.begin(); iter<vec.end(); iter++) {
//        cout<< "iter = "<<*iter<<endl;
//    }
    
    for (auto iter = vec.begin(); iter<vec.end(); iter++) {
        cout<< "iter = "<<*iter<<endl;
    }
    
    
    //遍历方式二
    cout<<"--------------遍历方式二--------------"<<endl;
    auto i = vec.begin();
    while (i!=vec.end()) {
        cout<<"i = "<<*i<<endl;
        i++;
    }
    
    //遍历方式三
    cout<<"--------------遍历方式三--------------"<<endl;
    for (int i=0; i<vec.size(); i++) {
        cout<<"vec["<<i<<"]="<<vec[i]<<endl;
    }
}

六、二维数组

void vector_erwei(){
    
    //实现方式一:
    cout<<"-------------实现方式一-------------"<<endl;
    {
        //5行4列的二维数组
        vector<vector<int>> vec(5,vector<int>(4));
        for (int row = 0; row<5; row++) {
            for (int col = 0; col<4; col++) {
                vec[row][col] = row+col;
            }
        }
        
        
        for (int row = 0; row<5; row++) {
            for (int col = 0; col<4; col++) {
                cout<<vec[row][col]<<" ";
            }
            cout<<endl;
        }
    }
    
    
    //实现方式二:
    cout<<"-------------实现方式二-------------"<<endl;
    {
        vector<int*>vec;
        int row0[4] = {0,1,2,3};
        int row1[4] = {1,2,3,4};
        int row2[4] = {2,3,4,5};
        int row3[4] = {3,4,5,6};
        int row4[4] = {6,7,8,9};

        vec.push_back(row0);
        vec.push_back(row1);
        vec.push_back(row2);
        vec.push_back(row3);
        vec.push_back(row4);

//        for (int i = 0; i<5; i++) {
//            int row[4] = {i,i+1,i+2,i+3};
//            vec.push_back(row);
//        }
      
        
        for (int row = 0; row<5; row++) {
            for (int col = 0; col<4; col++) {
                cout<<vec[row][col]<<" ";
            }
            cout<<endl;
        }
    }
    
}

list

https://blog.csdn.net/yas12345678/article/details/52601578/
list:
list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,
通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。
但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。

一、构造函数

void list_constructor(){
    
    //list() 声明一个空列表;
    cout<<"-------------li1-------------"<<endl;
    list<int> li1;
    list<int> li1_2 = list<int>();
    for (auto it = li1.begin();it != li1.end();it++) {
        cout<<"*it = "<<*it<<endl;
    }
    

    
    //list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的
    cout<<"-------------li2-------------"<<endl;
    list<int> li2(5);
    list<int> li2_2 = list<int>(5);
    for (auto it = li2.begin();it != li2.end();it++) {
        cout<<"*it = "<<*it<<endl;
    }

    
    
    
    //list(n,val) 声明一个由n个元素的列表,每个元素都是由其构造函数T(val)得来的
    cout<<"-------------li3-------------"<<endl;
    list<int> li3(5,2);
    list<int> li3_2 = list<int>(5,2);
    for (auto it = li3.begin();it != li3.end();it++) {
        cout<<"*it = "<<*it<<endl;
    }

    
    
    //list(list) 拷贝构造函数
    cout<<"-------------li4-------------"<<endl;
    list<int> li4(li3);
    list<int> li4_2 = list<int>(li3);
    for (auto it = li4.begin();it != li4.end();it++) {
        cout<<"*it = "<<*it<<endl;
    }
    
    //list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素
    cout<<"-------------li5-------------"<<endl;
    list<int> li5(li4.begin(),li4.end());
    for (auto it = li4.begin();it != li4.end();it++) {
        cout<<"*it = "<<*it<<endl;
    }
}

二、增删改查

void list_zengShanGaiCha(){
    
    //增
    cout<<"-------------增-------------"<<endl;
    {
        list<int> li(3,1);
        li.push_front(4);
        li.push_back(2);
        li.insert(li.end(), 3);
        li.insert(li.end(), 2,4);
        for (auto it = li.begin(); it!=li.end(); it++) {
            cout<<"*it = "<<*it<<endl;
        }
    }
    
    
    //删
    cout<<"-------------删-------------"<<endl;
    {
        list<int> li(5,1);
        
        //删除尾元素
        li.pop_back();
        
        //删除头元素
        li.pop_front();

        //list是链表所以iterator 只支持++ -- 不支持 li.end()+n;
        li.erase(--li.end());
        
        
        //[begin end)
        li.erase(++li.begin(),li.end());
        
        
        //清空
        li.clear();
        
        
        for (auto it = li.begin(); it!=li.end(); it++) {
            cout<<"*it = "<<*it<<endl;
        }
    }
    
    
    //改
    cout<<"-------------改-------------"<<endl;
    {
        //list是链表不支持快速存取
        list<int> li{1,2,3,4,5};
        list<int> li2{6,7,8};
        list<int> li3{1,3,5};
        
        li.assign(3,2);
        
        li.assign(li2.begin(),li2.end());
        
        li.swap(li3);

        
        for (auto it = li.begin(); it!=li.end(); it++) {
            cout<<"*it = "<<*it<<endl;
        }
    }
    
    
    //查
    cout<<"-------------查-------------"<<endl;
    {
        list<int> li{1,2,3,4,5};
        
        li.front();
        li.back();
       
        int key  = 2;
        //count判断
        if (count(li.begin(), li.end(), key)){
            cout << "Element found" << endl;
        }else{
            cout << "Element NOT found" << endl;
        }
        
        
        //find进行判断
        if (find(li.begin(), li.end(), key) != li.end()){
            cout << "Element found" << endl;
        }else{
            cout << "Element NOT found" << endl;
        }
    }
    
    
    //大小
    cout<<"-------------大小-------------"<<endl;
    {
        list<int> li{1,2,3,4,5};
        
        //大小
        cout<<"size = "<<li.size()<<endl;
        
        //判断是否为空
        cout<<"isEmpty = "<<li.empty()<<endl;
    }
}

三、遍历

void list_enum(){
    list<int> li{1,2,3,4,5};
    
    //遍历方式一
    cout<<"--------------遍历方式一--------------"<<endl;
    for (auto i = li.begin(); i!=li.end(); i++) {
        cout<<"i = "<<*i<<endl;
    }
    
    
    
    //遍历方式二
    cout<<"--------------遍历方式二--------------"<<endl;
    auto i = li.begin();
    while (i!=li.end()) {
        cout<<"i = "<<*i<<endl;
        i++;
    }
}

四、排序

bool list_compare(int a,int b){
    return b - a;
}
void list_sort(){
    list<int> li{1,2,3,6,5,4};
    li.sort();
    for (auto i = li.begin(); i!=li.end(); i++) {
        cout<<"i = "<<*i<<endl;
    }
    

    li.sort(list_compare);
    for (auto i = li.begin(); i!=li.end(); i++) {
        cout<<"i = "<<*i<<endl;
    }
}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.