页面加载中 . . .

C++顺序容器


本篇文章脑图地址

C++顺序容器

容器简介

容器的概念

容器是指存储相同数据类型的类模板,它既可以存储预定义的数据类型,也可以存储用户自定义的数据类型。
 C++标准模板库(STL)提供了10种容器类型用于存储数据。这10种容器用于存储数据的数据结构各不相同,比如链表数组。
 容器可以分为顺序容器和关联容器。

顺序容器的概念

顺序容器是用于存放单一数据类型的模板。
 顺序容器是通过数据在容器中的位置来对数据进行访问。

顺序容器的种类与选择

vector: 动态数组,支持快速随机访问,在中间插入和删除元素较慢。适用于存储大量元素,且需要随机访问的情况。
list:双向链表,支持快速插入和删除元素,在中间进行插入和删除元素较快,随机访问较慢。适用于存储大量元素,且需要频繁进行插入和删除元素的情况。
deque:双端队列,支持快速随机访问,在中间插入和删除元素较慢。适用于存储大量元素,且需要随机访问的情况。

vector简介

C++帮助文档

  1. C++标准库文档

  2. C++帮助文档

vector的概念

vector是根据数组实现的顺序容器。
 vector是一种动态数组,可以动态地增加和缩小数组的大小,也能存储不同的数据类型。

vector的操作

vector的使用

使用vector需要包含头文件#include <vector>
 vector的常用操作包括:
 1.vector::push_back 在数组尾部添加元素
 2.vector::pop_back 删除数组尾部元素
 3.vector::operator[] 通过下标访问数组中的元素
 4.vector::sort vector排序,vector的元素重载了运算符<,或者自行指定比较函数

示例代码

  1. 测试vector,新建main.cpp,代码如下:

    vector arr; 表示声明一个int类型的vector
     arr.push_back(51) 表示从名为arr的vector的尾部添加元素51
     arr.pop_back() 表示从名为arr的vector的尾部删除元素
     print_vec 是自定义函数,用于迭代打印vector的内容
     sort 是排序函数,第一个参数为待排序的开始,第二个参数是排序的结束,第三个参数为排序方式
     sort(arr.begin(), arr.begin()+4) 表示使用默认的升序排序排序 arr[0]到arr[3]四个元素
     sort(arr.begin(), arr.end(), myCompareObj)ss 表示自定义降序排序 arr

#include <iostream>
using namespace std;
#include <vector>
#include "student.h"
#include <algorithm>

template<typename T>
void print_vec(vector<T> vec)
{
    cout << "-------print begin---------" << endl;
    for (auto itr = vec.begin(); itr != vec.end(); ++itr)
    {
        cout << "iterator = " << *itr << endl;
    }
    cout << "--------print end----------" << endl;
}

struct myCompare
{
    template <typename T>
    bool operator() (T x, T y) { return (x > y); }
} myCompareObj;

int main(int argc, char *argv[])
{   
    vector<int> arr;
    arr.push_back(51);
    arr.push_back(32);
    arr.push_back(79);
    arr.push_back(45);
    arr.push_back(67);
    arr.push_back(85);
    arr.push_back(34);
    print_vec(arr);
    arr.pop_back();
    arr.push_back(44);
    print_vec(arr);
    sort(arr.begin(), arr.begin()+4);
    print_vec(arr);
    sort(arr.begin(), arr.end(), myCompareObj);
    print_vec(arr);
    return 0;
}
  1. 编译运行,效果如下:

    -------print begin---------
    iterator = 51
    iterator = 32
    iterator = 79
    iterator = 45
    iterator = 67
    iterator = 85
    iterator = 34
    --------print end----------
    -------print begin---------
    iterator = 51
    iterator = 32
    iterator = 79
    iterator = 45
    iterator = 67
    iterator = 85
    iterator = 44
    --------print end----------
    -------print begin---------
    iterator = 32
    iterator = 45
    iterator = 51
    iterator = 79
    iterator = 67
    iterator = 85
    iterator = 44
    --------print end----------
    -------print begin---------
    iterator = 85
    iterator = 79
    iterator = 67
    iterator = 51
    iterator = 45
    iterator = 44
    iterator = 32
    --------print end----------

    上述介绍了简单的C++ vector的用法,包括创建、插入、删除、排序等操作。接下来对Student类作为vector的元素进行操作,并实现自定义排序规则。

  2. 声明学生信息类,新建student.h,代码如下:

    #pragma once
    #ifndef _STUDENT_H
    #define _STUDENT_H
    #include <string>
    using namespace std;
    
    class Student
    {
    private:
    	int _id;
    	string _name;
    public:
    	Student(const string& name, int id);
    	int getId() const;
    	string getName() const;
    	void introduce() const;
    };
    #endif // !_STUDENT_H
  3. 实现学生信息类,新建student.cpp,代码如下:

    #include "student.h"
    #include <iostream>
    using namespace std;
    
    Student::Student(const string& name, int id)
    	:_name(name), _id(id)
    {
    }
    int Student::getId() const
    {
    	return _id;
    }
    string Student::getName() const
    {
    	return _name;
    }
    void Student::introduce() const
    {
    	cout << "Hello!I'm " << _name << ",my id card is " << _id << endl;
    }
  4. 重新编写main.cpp文件,代码如下:

    print_stu_vec(vector<Student> vec) 是迭代打印学生信息的函数,vec是学生信息的vector。
     rand_str(const int len) 是随机26英文小写字母字符串的函数,len是字符串的长度。
     struct testCompare 是自定义比较结构体,用于sort排序,优先比较名字长度,再比较id大小,越小越前。
    测试代码如下test函数

#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
#include "student.h"
using namespace std;

void print_stu_vec(vector<Student> vec)
{
    for (auto itr = vec.begin(); itr != vec.end(); ++itr)
    {
        itr->introduce();
    }
}
string rand_str(const int len)
{
    string str;               
    char c;                   
    int idx;     
    for (idx = 0; idx < len; idx++)
    {
        c = 'a' + rand() % 26; //  rand()%26是取余,余数为0~25加上'a',就是字母a~z,详见asc码表
        str.push_back(c);
    }
    return str; 
}
struct testCompare
{
    bool operator() (Student stu1, Student stu2) 
    {
        const int len1 = stu1.getName().length();
        const int len2 = stu2.getName().length();
        if (len1 > len2)
        {
            return true;
        }
        if (len1 < len2)
        {
            return false;
        }
        else
        {
            return (stu1.getId() < stu2.getId());
        }
    }
}testCompareObj;
void test00()
{
    vector<Student> students;
    for (int i = 0; i < 10; ++i)
    {
        const int len = rand() % 6+4;
        const string& name = rand_str(len);
        Student stu(name, i);
        students.push_back(stu);
    }
    print_stu_vec(students);
    cout << "--------------------------" << endl;
    sort(students.begin(), students.end(), testCompareObj);
    print_stu_vec(students);
}

int main(int argc, char *argv[])
{   

    test00();
    return 0;
}
  1. 运行程序,输出结果如下:
    Hello!I'm hqghumeay,my id card is 0
    Hello!I'm nlfdxfirc,my id card is 1
    Hello!I'm scxggbw,my id card is 2
    Hello!I'm fnqdux,my id card is 3
    Hello!I'm fnfozvsr,my id card is 4
    Hello!I'm kjprepg,my id card is 5
    Hello!I'm xrpnrvys,my id card is 6
    Hello!I'm mwcysyycq,my id card is 7
    Hello!I'm evikeff,my id card is 8
    Hello!I'm znimkk,my id card is 9
    --------------------------
    Hello!I'm hqghumeay,my id card is 0
    Hello!I'm nlfdxfirc,my id card is 1
    Hello!I'm mwcysyycq,my id card is 7
    Hello!I'm fnfozvsr,my id card is 4
    Hello!I'm xrpnrvys,my id card is 6
    Hello!I'm scxggbw,my id card is 2
    Hello!I'm kjprepg,my id card is 5
    Hello!I'm evikeff,my id card is 8
    Hello!I'm fnqdux,my id card is 3
    Hello!I'm znimkk,my id card is 9

文章作者: ZhiQ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZhiQ !
  目录