当前位置: 首页 > news >正文

vector向量类使用

向量是最简单的 STL 容器,其数据结构与数组相似,占据着一个连续的内存块。

   由于内存位置是连续的,所以向量中的元素可以随机访问,访问向量中任何一个元素的时间也是固定的。存储空间的管理是自动的,当要将一个元素插入到已满的向量中时,会为向量分配一个更大的内存块,将向量中的元素复制进新的内存块中,然后释放旧的内存块。所以,向量是一个灵活的数组,是能够动态改变自身大小的数组。#include <iostream>#include <vector>// 为了使用向量类#include <algorithm>#include <functional> // greater<T>using namespace std;// 通用打印 向量类vector的 元素 template<class T>void printVector(char *s, const vector<T>& v) {cout << s << " = (";if (v.size() == 0) {cout << ")\n";//输出 换行 return;}// 类型别名  常量迭代器  不能修改指向的对象 typename vector<T>::const_iterator i = v.begin();for( ; i != v.end()–1; i++)// for( ; i < v.end()-1; ++i)cout << *i << ' ';//打印元素 cout << *i << ")\n";//输出最后一个元素 并 换行 }bool f1(int n) {return n < 4;}int main() {int a[] = {1,2,3,4,5};vector<int> v1; // 向量v1 为空, size = 0, capacity = 0printVector("v1",v1);for (int j = 1; j <= 5; j++)v1.push_back(j); // v1 = (1 2 3 4 5), 大小size = 5, 当前最大存储能力 capacity = 8// 注意,向量没有 push_front()成员函数。vector<int> v2(3,7); // v2 = (7 7 7)vector<int> ::iterator i1 = v1.begin()+1;vector<int> v3(i1,i1+2); // 截取赋值 v3 = (2 3), size = 2, capacity = 2vector<int> v4(v1); // 拷贝赋值 v4 = (1 2 3 4 5), size = 5, capacity = 5vector<int> v5(5); // v5 = (0 0 0 0 0)v5[1] = v5.at(3) = 9; // 指定位置赋值 v5 = (0 9 0 9 0)// 向量的容量 可以通过函数 reserve()来改变(尽力改变)。v3.reserve(6); // v3 = (2 3), size = 2, capacity = 6v4.resize(7); // v4 = (1 2 3 4 5 0 0), size = 7, capacity = 10v4.resize(3); // v4 = (1 2 3), size = 3, capacity = 10v4.clear(); //清空 数据但是 分配的内存为减少 v4 is empty, size = 0, capacity = 10 !!!! // 向量的插入 v4.insert(v4.end(),v3[1]); // v4 = (3)v4.insert(v4.end(),v3.at(1)); // v4 = (3 3)v4.insert(v4.end(),2,4); // v4 = (3 3 4 4)v4.insert(v4.end(),v1.begin()+1,v1.end()-1); // v4 = (3 3 4 4 2 3 4)// 删除指定元素 v4.erase(v4.end()-2); // v4 = (3 3 4 4 2 4)v4.erase(v4.begin(), v4.begin()+4); // v4 = (2 4)// assign替换 先删除原有元素,在插入元素 v4.assign(3,8); // v4 = (8 8 8)v4.assign(a,a+3); // v4 = (1 2 3)// 逆 迭代器 从尾部向前 迭代 vector<int>::reverse_iterator i3 = v4.rbegin();for ( ; i3 != v4.rend(); i3++)cout << *i3 << ' '; // print: 3 2 1cout << endl;// 算法 algorithmsv5[0] = 3; // v5 = (3 9 0 9 0)// 条件替换   <4 的都被替换成 7 replace_if(v5.begin(),v5.end(),f1,7); // v5 = (7 9 7 9 7)//  replace_if(v5.begin(),v5.end(), bind2nd(less<int>(),4) ,7);//  bind2nd(op, a)是一个通用函数//直接替换 v5[0] = 3; v5[2] = v5[4] = 0; // v5 = (3 9 0 9 0)// 指定元素替换 0 -> 7 replace(v5.begin(),v5.end(),0,7); // v5 = (3 9 7 9 7)// sort 排序  快排 堆排 sort(v5.begin(),v5.end()); // v5 = (3 7 7 9 9)  升序排序 sort(v5.begin(),v5.end(),greater<int> ()); // v5 = (9 9 7 7 3)  降序排序呢// 前方插入 // 例如对于整型向量,成员函数 front()的原 型为:int& front() ; 可以 放在 左边 也可以放在右边  v5.front() = 2; // v5 = (2 9 7 7 3)return 0;}

使用自定义的类  作为 容器的元素  来使用 容器的一些算法

定义自己的类

 class Person {public:// 默认构造函数 Person(char *n = "", int a = 0) {name = strdup(n);// 复制字符串age = a;//复制年龄}// 默认析构函数~Person(){free(name);//释放 字符串指向的空间}// 重载 等号判断 运算符  返回布尔量  输入为常量 的引用 避免拷贝 同时 常量 避免修改bool operator==(const Person& p) const {return strcmp(name,p.name) == 0 && age == p.age;// 名字 和年龄都必须相等}// 重载 小于号  运算符  返回布尔量bool operator<(const Person& p) const {return strcmp(name,p.name) < 0;//这里 使用 名字字符串 来比较}// 重载 大于号  运算符  返回布尔量bool operator>(const Person& p) const {return !(*this == p) && !(*this < p);// 使用了 ==  和 小于号}private:// 私有变量char *name;int age;friend bool lesserAge(const Person&, const Person&);//有元函数  使用年龄来比较两个对象的大小};

使用向量 容器来 存储 自定义的 Person类

 vector<Person> vp(1, Person("Golg",26));//Person("Golg",26)使用 默认构造函数创建一类对象存放在向量容器内// 增加两个对象vp.push_back(Person("Any",20));vp.push_back(Person("Bil",30));// 使用向量容器的 排序算法  默认需要类对象 提供 小于运算符的重载(比较函数)sort(vp.begin(), vp.end());//  vp=(("Golg",26)("Any",20))("Bil",30)) --> (("Any",20))("Bil",30)("Golg",26))// 逆序排列sort(vp.begin(), vp.end(), greater<Person>());// vp= (("Any",20))("Bil",30)("Golg",26)) --> (("Golg",26)("Bil",30)("Any",20)))// 那么如何 使用 年龄来排序呢 1提供比较函数(要是有元函数)  2直接修改 小于运算符的重载 函数 方法// 1提供比较函数(要是有元函数)bool lesserAge(const Person& p1, const Person& p2){return  p1.age < p2.age;//小于时为真}// 传递比较函数sort(vp.begin(), vp.end(), lesserAge);// vp=  (("Golg",26)("Bil",30)("Any",20))) ---> (("Any",20)("Bil",30)("Golg",26)))
http://www.lryc.cn/news/178469.html

相关文章:

  • 【Java 进阶篇】MySQL多表查询:内连接详解
  • C理解(四):链表
  • 新手教程,蛋糕小程序的搭建流程一网打尽
  • springcloud之自我介绍
  • 机器学习之神经网络的层次
  • 力扣每日一题(+日常水几道题)
  • 百度SEO不稳定的原因及解决方法(百度SEO不稳定因素的5大包括)
  • 深度学习(1)---卷积神经网络
  • 探索社会工程的深度:从定义到高级攻击策略
  • CTF 入门指南:从零开始学习网络安全竞赛
  • Spring整合第三方框架
  • Linux Shell 无vi获取文件某行指定内容和修改某行指定内容
  • 在EXCEL中构建加载项之创建加载项的目的及规范要求
  • Hive【Hive(三)查询语句】
  • 商场做小程序商城的作用是什么?
  • XPD738协议系列-USB Type-C PD 和 Type-A 双口控制器
  • 【面试八股】IP协议八股
  • 【冰糖R语言】创建R包(打包R程序)
  • 照片后期处理软件DxO FilmPack 6 mac中文说明
  • 51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)
  • Scala第九章节
  • arduino - UNO-R3,mega2560-R3,NUCLEO-H723ZG的arduino引脚定义区别
  • 提取多个txt数据并合成excel——例子:与中国建交的国家
  • uni-app:js修改元素样式(宽度、外边距)
  • day36-单元测试
  • 7、脏话检测
  • Godot信号教程(使用C#语言)| 创建自定义信号 | 发出自定义信号 | 使用代码监听信号
  • 分布式文件存储系统minio、大文件分片传输
  • 在 msys2/mingw 下安装及编译 opencv
  • java 根据身份证号码判断性别