医院网站怎么做优化排名靠前百度推广要自己建站吗
摘要:
CC++ STL(Standard Template Library,标准模板库)在C++编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C++程序的开发效率和代码质量。
STL 容器 分为 2 大类 , 分别是“序列式容器” 和“关联式容器 ”。
- 序列式容器:每个元素都有固定位置,取决于插入时机和地点,其底层为线性序列的数据结构,里面存储的是元素本身。
- 关联式容器:元素位置取决于特定的排序准则,和插入顺序无关,其里面存储的是< key , value >结构的键值对,在数据检索时比序列式容器效率更高。
本系列博文将详细介绍C++STL的各种容器的特性优缺点,以及其常用算法方法等。本文介绍的是序列式容器-数组string,vector,array,bitset。
(开发环境:VScode,C++17)
关键词
: C++,STL,数据存储,数据类型,数组,array,string,vector,bitset
声明:
本文作者原创,转载请附上文章出处与本文链接。
文章目录
- 摘要:
- 正文:
- string
- 常用函数:
- 使用例子:
- array
- 常用函数:
- 使用例子:
- vector
- 常用函数:
- 使用例子:
- bitset
- 常用函数:
- 使用例子:
- 推荐阅读
正文:
string
string类本不是STL的容器,但是它与STL容器有着很多相似的操作,因此,把string放在这里一起进行介绍。C++中的string类相当于是字符数组,但是其更方便于我们的操作,而且不需要在输入之前初始化字符数组的容量,节省空间。(有需要更深入了解数据结构数组的,可看同专栏下数据结构分支)
常用函数:
- front():返回
string
第一个元素。 - back():返回
string
最后一个元素。 - insert():在指定位置索引插入字符。
- erase():从指定索引处开始删除字符。
- replace():从索引处开始替换字符。
- append():在字符串尾部拼接上字符串。
- size():返回
string
包含的元素个数。 - compare():比较两个字符串,如果
str
小于str2
,结果为负;相等则为0;大于则为正 。 - find():从前往后找对应的字符串,若找到,返回首字母下标。
- count():计算字符串中对应字符出现的次数。
- substr():返回从索引处开始的对应个数元素组成的字符串 。
- empty():判断字符串是否为空。
使用例子:
#include <iostream>
#include <string> int main()
{std::string str = "Hello, World!";// front 和 backstd::cout << "First character: " << str.front() << std::endl;std::cout << "Last character: " << str.back() << std::endl;// insertstr.insert(7, "Beautiful "); // 在索引7处插入"Beautiful "std::cout << "After insert: " << str << std::endl;// erasestr.erase(7, 9); // 从索引7开始删除9个字符(这里实际只有8个字符可删除)std::cout << "After erase: " << str << std::endl; // replacestr.replace(7, 5, "Great"); // 从索引7开始替换5个字符为"Great"std::cout << "After replace: " << str << std::endl;// appendstr.append(" and everyone!");std::cout << "After append: " << str << std::endl;// sizestd::cout << "Size of string: " << str.size() << std::endl;// comparestd::string str2 = "Hello, everyone!";int result = str.compare(str2); // 比较两个字符串std::cout << "Compare result: " << result << std::endl; // findsize_t pos = str.find("Great");std::cout << "Position of 'Great': " << pos << std::endl;// countsize_t count = str.count('o'); // 计算字符'o'出现的次数std::cout << "Number of 'o's: " << count << std::endl; // substrstd::string sub = str.substr(7, 5); // 从索引7开始获取长度为5的子字符串std::cout << "Substring: " << sub << std::endl;// emptyif (str.empty()) {std::cout << "String is empty." << std::endl;}else {std::cout << "String is not empty." << std::endl;}return 0;
}
array
C++ STL(Standard Template Library,标准模板库)中的
array
是一个固定大小的顺序容器,它支持随机访问。与vector
不同,array
的大小在编译时就必须确定,且之后不可改变。这意味着array
提供了比vector
更高的性能,因为它不需要在运行时动态分配内存或管理内存大小的变化。然而,这也意味着array
的灵活性较低,不适用于需要动态改变大小的场景。
常用函数:
- size():返回容器中的元素数量。
- empty():如果容器为空,则返回
true
。 - begin(), end():返回指向容器第一个元素和最后一个元素之后位置的迭代器。
- at(size_t pos):访问指定位置的元素,如果位置超出范围,则抛出
std::out_of_range
异常。 - operator[]:可以使用下标操作符
[]
来访问array
中的元素。
使用例子:
#include <iostream>
#include <array>int main()
{ std::array<int, 5> myArray = {1, 2, 3, 4, 5};// 遍历并打印数组for (int i = 0; i < myArray.size(); ++i) {std::cout << myArray[i] << " ";}std::cout << std::endl;// 使用at访问元素try {std::cout << "Element at position 3: " << myArray.at(3) << std::endl;}catch (const std::out_of_range& e) {std::cout << "Out of range error: " << e.what() << std::endl;}return 0;
}
vector
一句话来说,vector 就是能够动态调整大小的 array。和 array 一样,vector 使用连续内存空间来保存元素,这意味着其元素可以用普通指针的++和–操作来访问;不同于 array 的是,其存储空间可以自动调整。
常用函数:
- size():返回容器中元素的数量。
- empty():如果容器为空,则返回
true
。 - push_back(const T& value):在容器的末尾添加一个元素。
- pop_back():移除容器末尾的元素。
- begin(), end():返回指向容器第一个元素和最后一个元素之后位置的迭代器。
- insert(iterator pos, const T& value):在指定位置插入一个元素,并返回指向新插入元素的迭代器。
- erase(iterator pos):移除指定位置的元素,并返回指向被移除元素之后位置的迭代器。
- clear():移除容器中的所有元素。
使用例子:
#include <iostream>
#include <vector>int main()
{std::vector<int> myVector = {1, 2, 3, 4, 5};// 在末尾添加元素myVector.push_back(6);// 遍历并打印vectorfor (int i = 0; i < myVector.size(); ++i) {std::cout << myVector[i] << " ";}std::cout << std::endl;// 在指定位置插入元素myVector.insert(myVector.begin() + 2, 99); // 在第三个位置插入99// 再次遍历并打印vectorfor (int num : myVector) { // 使用范围for循环std::cout << num << " ";}std::cout << std::endl;return 0;
}
bitset
C++ STL(Standard Template Library,标准模板库)中的
bitset
是一个固定大小的位序列,其中每个位可以独立地设置为0或1,bitset容器相当于是01数组。bitset
是一个模板类,通常用于处理位操作,如设置、清除、翻转、测试位,以及执行位计数和位查找等操作。bitset
特别适用于需要精确控制位操作的场景,如权限管理、状态标记等。
常用函数:
- test(size_t pos):测试在位置
pos
上的位是否为1。 - set(size_t pos, bool val = true):将位置
pos
上的位设置为val
(默认为true
)。 - reset(size_t pos):将位置
pos
上的位设置为0。 - flip(size_t pos):翻转位置
pos
上的位。 - to_ulong()
和
to_ullong():将bitset
的内容转换为unsigned long
或unsigned long long
类型(注意,这可能会导致数据丢失,如果bitset
的大小超过了目标类型的位数)。 - size():返回
bitset
中位的数量。 - count():返回
bitset
中设置为1的位的数量。 - any():如果
bitset
中至少有一个位被设置为1,则返回true
。 - none():如果
bitset
中没有位被设置为1,则返回true
。 - all():如果
bitset
中的所有位都被设置为1,则返回true
。
使用例子:
#include <iostream>
#include <bitset>int main()
{std::bitset<8> myBitset("10101010");// 测试并打印特定位std::cout << "Bit 3: " << myBitset.test(3) << std::endl; // 输出1,因为第3位是1(从0开始计数)// 翻转特定位myBitset.flip(3);std::cout << "After flipping bit 3: " << myBitset << std::endl; // 输出01101010// 设置特定位myBitset.set(5);std::cout << "After setting bit 5: " << myBitset << std::endl; // 输出01101110// 重置特定位myBitset.reset(5);std::cout << "After resetting bit 5: " << myBitset << std::endl; // 输出01101010// 输出1的个数std::cout << "Number of 1s: " << myBitset.count() << std::endl; // 输出4return 0;
}
推荐阅读
博客主页:https://blog.csdn.net/weixin_45068267
(客官逛一逛,有许多其它有趣的专栏博文)
C/C++专栏:https://blog.csdn.net/weixin_45068267/category_12268204.html
(内含其它STL容器使用及对应的数据结构实现)