掌握STL用法,解析经典例题 C++的标准模板库(STL)是一套功能强大的模板类和函数,它提供了通用的编程数据结构和算法,大大提高了代码的复用性和开发效率。下面我们将详细介绍STL的用法,并结合经典例题进行解析。
STL概述 STL主要由容器、算法和迭代器三部分组成。容器用于存储数据,算法用于操作数据,迭代器则作为容器和算法之间的桥梁,使得算法可以独立于容器进行操作。 容器可以分为序列式容器和关联式容器。序列式容器包括向量(vector)、列表(list)、双端队列(deque)等,它们按照元素插入的顺序存储元素。关联式容器包括集合(set)、映射(map)等,它们根据元素的值或键来存储元素,便于快速查找。 算法则提供了各种操作,如排序、查找、替换等。迭代器可以看作是一种广义的指针,它可以遍历容器中的元素。
常用容器及用法
- 向量(vector) 向量是一种动态数组,它可以在运行时动态调整大小。下面是一个简单的向量使用示例: cpp #include #include int main() { std::vector vec; // 插入元素 vec.push_back(1); vec.push_back(2); vec.push_back(3); // 遍历向量 for (int i = 0; i < vec.size(); i++) { std::cout } std::cout return 0; }
在这个示例中,我们首先创建了一个整数向量,然后使用www.ysdslt.com/push_back方法插入元素,最后使用循环遍历向量并输出元素。
2. 集合(set)
集合是一种关联式容器,它存储唯一的元素,并且会自动对元素进行排序。下面是一个集合的使用示例:
cpp
#include
#include
int main() {
std::set s;
// 插入元素
s.insert(3);
s.insert(1);
s.insert(2);
// 遍历集合
for (auto it = s.begin(); it != s.end(); it++) {
std::cout
}
std::cout
return 0;
}
在这个示例中,我们创建了一个整数集合,使用insert方法插入元素,然后使用迭代器遍历集合并输出元素。可以看到,集合会自动对元素进行排序。
3. 映射(map)
映射是一种关联式容器,它存储键值对,每个键都是唯一的。下面是一个映射的使用示例:
cpp
#include
#include
#include
int main() {
std::map m;
// 插入键值对
m["apple"] = 1;
m["banana"] = 2;
m["cherry"] = 3;
// 遍历映射
for (auto it = m.begin(); it != m.end(); it++) {
std::cout first second
}
return 0;
}
在这个示例中,我们创建了一个字符串到整数的映射,使用下标操作符插入键值对,然后使用迭代器遍历映射并输出键值对。
常用算法及用法
- 排序算法(sort)
排序算法可以对容器中的元素进行排序。下面是一个使用
sort算法对向量进行排序的示例: cpp #include #include #include int main() { std::vector vec = {3, 1, 2}; // 排序 std::sort(vec.begin(), vec.end()); // 输出排序后的向量 for (int i = 0; i < vec.size(); i++) { std::cout } std::cout return 0; }
在这个示例中,我们使用sort算法对向量进行排序,sort函数接受两个迭代器作为参数,表示排序的范围。
2. 查找算法(find)
查找算法可以在容器中查找指定的元素。下面是一个使用find算法在向量中查找元素的示例:
cpp
#include
#include
#include
int main() {
std::vector vec = {1, 2, 3};
// 查找元素
auto it = std::find(vec.begin(), vec.end(), 2);
if (it != vec.end()) {
std::cout
} else {
std::cout
}
return 0;
}
在这个示例中,我们使用find算法在向量中查找元素2,如果找到则输出元素的位置,否则输出未找到的信息。
经典例题解析
- 两数之和问题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数的下标。 cpp #include #include #include std::vector twoSum(std::vector& nums, int target) { std::unordered_map map; for (int i = 0; i < nums.size(); i++) { int complement = target - nums[i]; if (map.find(complement) != map.end()) { return {map[complement], i}; } map[nums[i]] = i; } return {}; } int main() { std::vector nums = {2, 7, 11, 15}; int target = 9; std::vector result = twoSum(nums, target); for (int i = 0; i < result.size(); i++) { std::cout } std::cout return 0; }
在这个问题中,我们使用了哈希表(unordered_map)来存储元素和它的下标,通过遍历数组,计算目标值与当前元素的差值,如果差值在哈希表中存在,则找到了两个数的下标。
2. 有效的括号问题
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
cpp
#include
#include
#include
#include
bool isValid(std::string s) {
std::stack stack;
std::unordered_map mapping = {{')', '('}, {'}', '{'}, {']', '['}};
for (char c : s) {
if (mapping.find(c) != mapping.end()) {
char topElement = stack.empty() ? '#' : stack.top();
if (stack.empty() || mapping[c] != topElement) {
return false;
}
stack.pop();
} else {
stack.push(c);
}
}
return stack.empty();
}
int main() {
std::string s = "()[]{}";
std::cout
return 0;
}
在这个问题中,我们使用栈来存储左括号,当遇到右括号时,检查栈顶元素是否匹配,如果匹配则弹出栈顶元素,最后如果栈为空则说明字符串有效。
总结与建议 通过对STL的学习和经典例题的解析,我们可以看到STL的强大功能和灵活性。在实际编程中,我们应该熟练掌握STL的各种容器和算法,根据具体问题选择合适的容器和算法。 同时,多做一些经典例题可以帮助我们更好地理解和应用STL。建议大家在学习过程中,不仅要记住语法,还要理解其背后的原理和应用场景。 另外,在使用STL时,要注意性能问题,不同的容器和算法有不同的时间复杂度,选择合适的容器和算法可以提高程序的性能。