怎样让自己网站的文章被百度收录嘉兴网站建设嘉兴
web/
2025/10/1 19:06:26/
文章来源:
怎样让自己网站的文章被百度收录,嘉兴网站建设嘉兴,青岛网站建设 上流,erp软件怎么用C之STL整理#xff08;1#xff09;之STL、vector、map、set数据结构初识 注#xff1a;整理一些突然学到的C知识#xff0c;随时mark一下 例如#xff1a;忘记的关键字用法#xff0c;新关键字#xff0c;新数据结构 C 的 STL C之STL整理#xff08;1#xff09;之ST…C之STL整理1之STL、vector、map、set数据结构初识 注整理一些突然学到的C知识随时mark一下 例如忘记的关键字用法新关键字新数据结构 C 的 STL C之STL整理1之STL、vector、map、set数据结构初识一、STL概要初识STL1、STL之容器1序列式容器2关联式容器 2、算法3、迭代器与遍历1对vector的遍历2对map的遍历3对set的遍历 4、仿函数5、适配器6、空间配置器 总结 提示本文为 C 中 vector、map、set的写法和举例 一、STL概要初识STL STL即Standard Template Library标准模板库是C标准库的一个重要组成部分。它是一个可复用的封装好的组件库同时也是一个包罗数据结构与算法的软件框架。STL为C程序员们提供了一个可扩展的应用框架高度体现了软件的封装性与可复用性。
STL包含了诸多在计算机科学领域里所常用的数据结构和基本算法提供了许多通用的模板类和函数用于实现常用的数据结构和算法。STL的一个重要特点是数据结构和算法的分离它允许程序员编写通用的代码即可适用于不同的数据类型而不必为每种类型编写不同的代码。
STL的六大组件包括容器Containers、迭代器Iterators、算法Algorithms、仿函数Functors、适配器Adapters和空间配置器Allocators。
其中 容器负责存储和管理数据每种容器相当于定义好的一个反映数据结构的类模板类如字符串string、向量vector、列表list、双端队列deque、栈stack、队列queue、优先队列priority_queue、集合set、映射map等。 迭代器则用于遍历容器中的元素。 算法是对容器中的数据进行操作的函数分为质变算法和非质变算法。 仿函数和行为类似于函数的对象可以作为算法的参数以定制算法的行为。 适配器用于修改容器或迭代器的接口以提供不同的功能。 空间配置器则负责内存的分配和释放。
1、STL之容器
容器存储数据的数据结构类如vector、deque、list等C的string数据结构也是一个封装好的容器。
算法对容器中的数据进行操作的函数模板如排序、查找等。
迭代器提供一种方法来访问容器中的元素。
仿函数行为类似函数的对象可以作为算法的参数来定制算法的行为。
适配器用于修改容器或迭代器的接口以提供不同的功能。
空间配置器负责内存分配和释放的组件通常不需要直接操作。
1序列式容器
序列式容器中的元素按照插入顺序进行存储。
Vector容器又叫动态数组支持随机访问。
#include vector
#include iostream int main() { std::vectorint vec {1, 2, 3, 4, 5}; for (const auto element : vec) { std::cout element ; } return 0;
}Deque容器双端队列支持在头部和尾部进行插入和删除操作。
#include deque
#include iostream int main() { std::dequeint deq {1, 2, 3, 4, 5}; deq.push_front(0); // 在头部插入元素 deq.push_back(6); // 在尾部插入元素 for (const auto element : deq) { std::cout element ; } return 0;
}List容器双向链表支持在任意位置进行插入和删除操作。
#include list
#include iostream int main() { std::listint lst {1, 2, 3, 4, 5}; lst.push_front(0); // 在头部插入元素 lst.push_back(6); // 在尾部插入元素 for (const auto element : lst) { std::cout element ; } return 0;
}2关联式容器
关联式容器中的元素通过关键字进行存储和访问。关联式容器是非线性的树结构更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系也就是说元素在容器中并没有维持元素置入容器时的逻辑顺序。
Set/multiset容器集合存储唯一或重复的元素。
#include set
#include iostream int main() { std::setint s {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}; for (const auto element : s) { std::cout element ; } return 0;
}Map/multimap容器键值对集合存储不重复/重复的键及其对应的值。
#include map
#include iostream int main() { std::mapstd::string, int m {{Alice, 25}, {Bob, 30}, {Charlie, 35}}; for (const auto pair : m) { std::cout pair.first : pair.second std::endl; } return 0;
}2、算法
质变算法 质变算法会改变容器内元素的内容。
拷贝算法例如std::copy。
#include vector
#include algorithm
#include iostream
#include iterator int main() { std::vectorint src {1, 2, 3, 4, 5}; std::vectorint dst(src.size()); std::copy(src.begin(), src.end(), dst.begin()); for (const auto element : dst) { std::cout element ; } return 0;
}非质变算法 非质变算法不会改变容器内元素的内容。
查找算法例如std::find。 继续上面的内容讲解我们来看非质变算法的一个例子——std::find。
#include vector
#include algorithm
#include iostream int main() { std::vectorint vec {1, 2, 3, 4, 5}; auto it std::find(vec.begin(), vec.end(), 3); // 查找值为3的元素 if (it ! vec.end()) { std::cout Found: *it std::endl; } else { std::cout Not found std::endl; } return 0;
}在这个例子中std::find算法在vec容器中查找值为3的元素并返回一个迭代器指向找到的元素。如果找不到则返回end()迭代器。
3、迭代器与遍历
迭代器提供了一种方法来遍历容器中的元素。上面的算法例子中已经展示了如何使用冒号遍历当然数组可以用[]遍历STL提供的新的遍历方法使用迭代器。迭代器类似于指针但提供了更安全的访问方式。STL提供了不同类型的迭代器如输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器等每种类型支持不同的操作集。它使得程序员能够遍历容器如vector、map、set等中的元素同时隐藏了底层数据结构的实现细节。迭代器就像是指向容器中元素的指针或引用但它比指针更加类型安全并且可以处理不同类型的容器。 语法是T类::iterator 迭代器指针名字 。 begin()这个接口返回一个指向容器第一个元素的迭代器。end()这个接口返回一个指向容器“尾后”位置的迭代器。注意这不是容器的最后一个元素而是最后一个元素再之后的位置。对于空容器begin() 返回的迭代器与 end() 返回的迭代器是相等的。
下面是对vector、map和set使用迭代器进行遍历的示例代码
1对vector的遍历
#include iostream
#include vectorint main() {std::vectorint vec {1, 2, 3, 4, 5};// 使用迭代器遍历vectorfor (std::vectorint::iterator it vec.begin(); it ! vec.end(); it) {std::cout *it ;}std::cout std::endl;// 使用基于范围的for循环遍历vectorC11及以后for (int val : vec) {std::cout val ;}std::cout std::endl;return 0;
}2对map的遍历
#include iostream
#include mapint main() {std::mapstd::string, int myMap {{apple, 1}, {banana, 2}, {cherry, 3}};// 使用迭代器遍历mapfor (std::mapstd::string, int::iterator it myMap.begin(); it ! myMap.end(); it) {std::cout it-first : it-second std::endl;}// 使用基于范围的for循环遍历mapC11及以后for (const auto kv : myMap) {std::cout kv.first : kv.second std::endl;}return 0;
}3对set的遍历
#include iostream
#include setint main() {std::setint mySet {1, 3, 5, 7, 9};// 使用迭代器遍历setfor (std::setint::iterator it mySet.begin(); it ! mySet.end(); it) {std::cout *it ;}std::cout std::endl;// 使用基于范围的for循环遍历setC11及以后for (int val : mySet) {std::cout val ;}std::cout std::endl;return 0;
}在上面的代码中可以看到对于vector、map和set我们都可以使用传统的迭代器进行遍历也可以使用C11及以后版本的基于范围的for循环进行遍历。基于范围的for循环更加简洁易于理解。但需要注意的是基于范围的for循环在遍历map时返回的是键值对key-value pair而不是单独的键或值。 注意map和set不支持用数组符号[]来遍历和索引。
4、仿函数
仿函数是行为类似于函数的对象。它们可以像函数一样被调用并可以作为算法的参数以定制算法的行为一般配合 algorithm 使用。例如std::lessT是一个仿函数用于比较两个对象是否一个小于另一个。
#include vector
#include algorithm
#include iostream struct IsEven { bool operator()(int n) const { return n % 2 0; }
}; int main() { std::vectorint vec {1, 2, 3, 4, 5}; vec.erase(std::remove_if(vec.begin(), vec.end(), IsEven()), vec.end()); for (const auto element : vec) { std::cout element ; } return 0;
}在这个例子中我们定义了一个仿函数IsEven它接受一个整数并检查它是否为偶数。然后我们使用std::remove_if算法和IsEven仿函数来移除vec中所有的偶数。
5、适配器
适配器用于修改容器或迭代器的接口以提供不同的功能。例如std::stack和std::queue就是基于std::deque或std::list等容器的适配器它们提供了栈和队列的接口。
#include stack
#include iostream int main() { std::stackint stk; stk.push(1); stk.push(2); stk.push(3); while (!stk.empty()) { std::cout stk.top() ; stk.pop(); } return 0;
}在这个例子中我们使用了std::stack适配器来创建一个栈并使用其提供的push、pop和top等方法来操作栈。
6、空间配置器
空间配置器负责内存的分配和释放。在STL中它通常被封装起来不需要直接操作。空间配置器允许STL库更高效地管理内存特别是在大量小对象的情况下。
总结
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85210.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!