资讯动态

《Eigen入门》第 12 章 · 标准库容器

发布时间:2026/10/18 23:02:45 来源:尧图企业网站定制
C 风格数组int a[5]有很多毛病大小固定、不记录长度、容易越界。C 标准库提供了更好用的容器最常用的就是std::vector动态数组。本章重点讲它并简要介绍其他容器。12.1 std::vector会自动变长的数组std::vector是动态数组大小可以随时改变自动管理内存还记录长度。#includevector#includeiostreamintmain(){std::vectorintv;// 空的 int 向量v.push_back(10);// 末尾追加元素v.push_back(20);v.push_back(30);std::cout大小v.size()std::endl;// 3// 像数组一样用下标访问std::coutv[0] v[1] v[2]std::endl;return0;}实际输出大小3 10 20 30常用操作操作例子说明追加v.push_back(x)末尾加一个元素大小v.size()元素个数访问v[i]第 i 个元素访问安全v.at(i)越界会报错判空v.empty()是否为空清空v.clear()删除所有元素删末尾v.pop_back()删除最后一个初始化 vectorstd::vectorintv1;// 空std::vectorintv2(5);// 5 个元素默认值 0std::vectorintv3(5,7);// 5 个 7std::vectorintv4{1,2,3};// 花括号初始化12.2 遍历 vector传统 for 循环for(std::size_t i0;iv.size();i){std::coutv[i] ;}循环变量的类型别写intv.size()返回的是无符号的std::size_tint和它比较在-Wall下会出警告comparison of integer expressions of different signedness实测 g 会报。要么写std::size_t要么用下面的范围 for。范围 forrange-for推荐C11 引入的范围 for简洁直观for(intx:v){// 依次把 v 的每个元素赋给 xstd::coutx ;}for(intx:v){// 用引用可以修改元素x*2;// 每个元素翻倍}for(constintx:v){// 常量引用只读避免复制std::coutx ;}读作“对 v 中的每个 x执行下面的操作。”12.3 vector 装自定义类型vector 能装任何类型包括类和 Eigen 矩阵#includevector#includestring#includeiostreamstructStudent{std::string name;intage;};intmain(){std::vectorStudentstudents;students.push_back({张三,20});students.push_back({李四,22});for(constautos:students){// auto 自动推导类型第 15 章std::couts.name s.agestd::endl;}return0;}实际输出张三 20 李四 22这个vector 装结构体的组合正是第 35 章用std::vectorEigen::Vector3d存点云的同一种写法。12.4 其他常用容器容器特点场景std::vector动态数组连续存储最常用默认首选std::string字符的动态数组字符串std::map键值对按键排序字典、查表std::set不重复元素的集合去重std::list双向链表频繁中间插入删除最常用的就是vector掌握它就能应付大多数场景。其他容器需要时再查。12.5 完整示例统计分数#includeiostream#includevectorintmain(){std::vectorintscores;intscore;std::cout输入分数输入 -1 结束std::endl;while(std::cinscore){// 读不到数字输入失败就退出循环if(score-1)break;// 哨兵值 -1 结束输入scores.push_back(score);}// 求平均分intsum0;for(ints:scores){sums;}doubleavgscores.empty()?0:static_castdouble(sum)/scores.size();std::cout共 scores.size() 个分数平均 avgstd::endl;return0;}这里用了三目运算符条件 ? 值1 : 值2条件为真取值 1否则取值 2。它相当于简化的 if-else。运行输入分数后依次敲809070-1每行一个输入分数输入 -1 结束 80 90 70 -1 共 3 个分数平均 80最后一行是程序打印的前面四行是你输入的。这种循环读入 哨兵值结束是命令行程序收集不定数量数据的标准写法第 35 章用vectorMatrix批量处理数据时是同一个套路。12.6 vector 与 Eigen 的关系学会 vectorEigen 就好理解了std::vectordouble是动态长度的一维数组Eigen::VectorXd是动态长度的向量多了数学运算std::vectorEigen::Vector3d是装了很多 3D 向量的容器实战常见而且后面你会经常写std::vectorEigen::MatrixXd来管理一批矩阵。12.7 小结std::vector自动变长的数组push_back追加、size取大小、[]访问。范围 forfor (int x : v)简洁遍历。vector 能装任何类型。最常用的容器就是 vector其他按需查询。下一章学习函数重载与运算符重载让代码更自然。练习题用 vector 存 5 个整数求它们的和与最大值。从键盘循环读入数字存入 vector输入 0 结束打印所有数字。用范围 for 遍历并打印 vector 的每个元素。创建std::vectorstd::string存三个名字遍历打印。用 vector 存一个 3x3 矩阵的 9 个元素求对角线之和。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑