C++顺序容器
容器简介
容器的概念
容器是指存储相同数据类型的类模板,它既可以存储预定义的数据类型,也可以存储用户自定义的数据类型。
C++标准模板库(STL)提供了10种容器类型用于存储数据。这10种容器用于存储数据的数据结构各不相同,比如链表数组。
容器可以分为顺序容器和关联容器。
顺序容器的概念
顺序容器是用于存放单一数据类型的模板。
顺序容器是通过数据在容器中的位置来对数据进行访问。
顺序容器的种类与选择
vector: 动态数组,支持快速随机访问,在中间插入和删除元素较慢。适用于存储大量元素,且需要随机访问的情况。
list:双向链表,支持快速插入和删除元素,在中间进行插入和删除元素较快,随机访问较慢。适用于存储大量元素,且需要频繁进行插入和删除元素的情况。
deque:双端队列,支持快速随机访问,在中间插入和删除元素较慢。适用于存储大量元素,且需要随机访问的情况。
vector简介
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的元素重载了运算符<
,或者自行指定比较函数
示例代码
- 测试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;
}
编译运行,效果如下:
-------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
的元素进行操作,并实现自定义排序规则。声明学生信息类,新建
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
实现学生信息类,新建
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; }
重新编写
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;
}
- 运行程序,输出结果如下:
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