免费的html网站,住总第三开发建设有限公司网站,游戏网站搭建需要多少钱,开发次元世界文本旨在对 C 的容器 vector 进行肤浅的分析。 文章目录 Ⅰ、vector 的指定元素删除代码结果与分析 Ⅱ、vector 在新增元素后再删除指定元素代码结果与分析 Ⅲ、vector 在特定条件下新增元素代码结果与分析 参考文献 Ⅰ、vector 的指定元素删除
代码
#include iostream 的容器 vector 进行肤浅的分析。 文章目录 Ⅰ、vector 的指定元素删除代码结果与分析 Ⅱ、vector 在新增元素后再删除指定元素代码结果与分析 Ⅲ、vector 在特定条件下新增元素代码结果与分析 参考文献 Ⅰ、vector 的指定元素删除
代码
#include iostream
#include vectorusing namespace std;int main() {std::vectorint v {8, 5, 6, 2, 4, 7};for (auto i v.begin(); i ! v.end();) {cout i.base() v.begin().base() endl;if (*i 2) {i v.erase(i);} else {i;}}cout size : v.size() endl;for (auto j v.begin(); j ! v.end(); j) {cout (*j) endl;}
}
结果与分析
先说明一下 vector.erase() 就是动态数组的指定位置的删除其返回值为指向下一个元素( 或 end() ) 的迭代器。 而关于迭代器需要知道的点为
迭代器不是指针是类模板表现的 像 指针。他只是 模拟了指针的一些功能通过 重载了指针的一些操作符-,*, --等封装了指针是一个“可遍历STL Standard Template Library容器内全部或部分元素”的对象 本质是封装了原生指针是指针概念的一种提升lift提供了比指针更高级的行为相当于一种智能指针他可以根据不同类型的数据结构来实现不同的–等操作迭代器返回的是 对象引用而不是对象的值所以cout只能输出迭代器使用 *取值后的值而不能直接输出其自身。在设计模式中有一种模式叫 迭代器模式简单来说就是提供一种方法在不需要暴露某个容器的内部表现形式情况下使之能依次访问该容器中的各个元素这种设计思维在STL中得到了广泛的应用是STL的关键所在通过 迭代器容器和算法可以有机的粘合在一起只要对算法给予不同的迭代器就可以对不同容器进行相同的操作。
这也就是下面 vector v 的首地址为72b0每次进行 i 其基地址就加了 4 一个 int 的字节量。而在删除了 元素 2 之后迭代器的值仍然为 72bc但是在删除之后这个值志向了元素 4。完美的解释了代码。那么问题的出现请看第二节。
Ⅱ、vector 在新增元素后再删除指定元素
代码
#include iostream
#include vectorusing namespace std;int main() {std::vectorint v {8, 5, 6, 2, 4, 7};for (auto i v.begin(); i ! v.end();) {// cout i.base() v.begin().base() endl;if (*i 8) {v.push_back(88);i v.erase(i);} else {i;}}cout size : v.size() endl;for (auto j v.begin(); j ! v.end(); j) {cout (*j) endl;}结果与分析
此时在添加了一个新的元素后再进行删除操作会发生段错误。而且为什么会有两个88。这就是我遇见的问题所在。虽然用 int vector 和 打印地址的方式可以很快地发现问题。但我面对的是 vectorexpr *呀。。。这么来看我好想确实有苦说不出阿。没办法是这样的唉。 而且一般来说也没人会打印迭代器的基地址。虽然打印了问题就能一目了然了但我是煞笔 此时为什么会有两个88而且元素 5 去哪了。这就是问题的所在了。但是答案其实就在 vector 的定义和名称中动态数组 。最后答案的揭晓在第三节。
Ⅲ、vector 在特定条件下新增元素
代码
#include iostream
#include vectorusing namespace std;int main() {std::vectorint v {8, 5, 6, 2, 4, 7};for (auto i v.begin(); i ! v.end();) {cout i.base() v.begin().base() endl;if (*i 8) {v.push_back(88); i;} else {i;}}cout size : v.size() endl;for (auto j v.begin(); j ! v.end(); j) {cout (*j) endl;}结果与分析 最开始 v 的首地址为b2b0但是在添加了一个元素之后其首地址发送了改变aka 内存发现了一片新的区域来更合适的存储这个数组从而动态地发生了改变。但是此时我们设定的迭代器并未改变。可以看出在进行了 275 次自加操作后迭代器才完成了对于新数组的访问。 结尾处 的来两个88也很好解释了在最开始的 元素8 处向数组中添加了一个 88。从而导致了数组 v的内存地址发生了改变。在经历了漫长的自加操作后迭代器 i 又找到了一个元素 8就又添加了一个新的元素 88。 至此问题结束数组动态地删除指定元素的模板就是第一节的代码不要在删除的过程中添加新的元素反之亦然。希望可以帮到你wish u all the best.
参考文献
iterator迭代器和指针的区别stl_vector.h