在本章中,我们将详细介绍C++标准模板库(STL),它提供了许多常用的容器、算法和迭代器。使用STL可以极大地提高编程效率和代码质量。
容器
容器用于存储数据。STL中的容器主要分为以下几类:
序列容器
序列容器按照线性顺序存储元素,并允许通过位置访问这些元素。主要的序列容器有vector、list和deque。
vector
vector是一个动态数组,支持随机访问,并且可以在尾部高效地添加或删除元素。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
v.push_back(4); // 尾部添加元素
for (int i : v) {
std::cout << i << " ";
}
return 0;
}list
list是一个双向链表,不支持随机访问,但可以在任何位置高效地插入和删除元素。
// www.javascriptcn.com code example
#include <iostream>
#include <list>
int main() {
std::list<int> l = {1, 2, 3};
l.insert(l.begin(), 0); // 在头部插入元素
for (int i : l) {
std::cout << i << " ";
}
return 0;
}deque
deque(双端队列)是双端可扩展的数组,支持随机访问,并且可以在两端高效地添加或删除元素。
// www.javascriptcn.com code example
#include <iostream>
#include <deque>
int main() {
std::deque<int> d = {1, 2, 3};
d.push_front(0); // 头部添加元素
for (int i : d) {
std::cout << i << " ";
}
return 0;
}关联容器
关联容器用于存储键值对,并且键通常是唯一的。主要的关联容器有set、map和multiset、multimap。
set
set是一个集合,其中每个元素都是唯一的,且按升序排序。
// www.javascriptcn.com code example
#include <iostream>
#include <set>
int main() {
std::set<int> s = {3, 1, 2};
s.insert(4); // 添加元素
for (int i : s) {
std::cout << i << " ";
}
return 0;
}map
map是一个键值对的集合,其中键是唯一的,且按键的升序排序。
// www.javascriptcn.com code example
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}};
m["orange"] = 3; // 添加元素
for (auto& p : m) {
std::cout << p.first << ": " << p.second << "\n";
}
return 0;
}无序容器
无序容器用于存储元素,不保证元素的顺序。主要的无序容器有unordered_set、unordered_map、unordered_multiset、unordered_multimap。
unordered_set
unordered_set是一个集合,其中每个元素都是唯一的,但不保证元素的顺序。
// www.javascriptcn.com code example
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> us = {3, 1, 2};
us.insert(4); // 添加元素
for (int i : us) {
std::cout << i << " ";
}
return 0;
}unordered_map
unordered_map是一个键值对的集合,其中键是唯一的,但不保证元素的顺序。
// www.javascriptcn.com code example
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> um = {{"apple", 1}, {"banana", 2}};
um["orange"] = 3; // 添加元素
for (auto& p : um) {
std::cout << p.first << ": " << p.second << "\n";
}
return 0;
}迭代器
迭代器是一种用于遍历容器中元素的对象。STL提供多种类型的迭代器,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。
输入迭代器
输入迭代器只能用于读取数据,不能修改数据,也不支持多次遍历。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
std::istream_iterator<int> it(std::cin), end;
for (; it != end; ++it) {
std::cout << *it << " ";
}
return 0;
}输出迭代器
输出迭代器只能用于写入数据,不能读取数据,也不支持多次遍历。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v(3);
std::ostream_iterator<int> it(std::cout, " ");
*it = 1;
*++it = 2;
*++it = 3;
return 0;
}前向迭代器
前向迭代器支持单次遍历和读写操作。
// www.javascriptcn.com code example
#include <iostream>
#include <list>
int main() {
std::list<int> l = {1, 2, 3};
std::forward_iterator_tag tag;
std::for_each(l.begin(), l.end(), [](int& n) { ++n; });
for (auto it = l.begin(); it != l.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}双向迭代器
双向迭代器支持双向遍历和读写操作。
// www.javascriptcn.com code example
#include <iostream>
#include <list>
int main() {
std::list<int> l = {1, 2, 3};
auto it = l.begin();
++it; // 向后移动
--it; // 向前移动
for (auto it = l.begin(); it != l.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}随机访问迭代器
随机访问迭代器支持任意位置的访问和读写操作。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
v[1] = 4; // 随机访问
for (int i = 0; i < v.size(); ++i) {
std::cout << v[i] << " ";
}
return 0;
}算法
STL 提供了丰富的算法来处理容器中的数据。这些算法主要分为非修改序列操作、修改序列操作、排序与复制、数值操作等。
非修改序列操作
非修改序列操作包括查找、计数和比较等。
find
find函数用于在容器中查找指定元素的第一个出现位置。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
auto it = std::find(v.begin(), v.end(), 2);
if (it != v.end()) {
std::cout << "找到元素: " << *it << "\n";
} else {
std::cout << "未找到元素\n";
}
return 0;
}count
count函数用于计算容器中某个元素出现的次数。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 2, 3};
int count = std::count(v.begin(), v.end(), 2);
std::cout << "元素出现次数: " << count << "\n";
return 0;
}equal
equal函数用于判断两个范围内的元素是否相等。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {1, 2, 3};
bool result = std::equal(v1.begin(), v1.end(), v2.begin());
if (result) {
std::cout << "元素相等\n";
} else {
std::cout << "元素不相等\n";
}
return 0;
}修改序列操作
修改序列操作包括替换、删除、移动等。
replace
replace函数用于将容器中所有指定的元素替换为另一个值。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 2, 4};
std::replace(v.begin(), v.end(), 2, 5);
for (int i : v) {
std::cout << i << " ";
}
return 0;
}remove
remove函数用于移除容器中所有等于特定值的元素,但不会实际减少容器的大小。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 2, 4};
v.erase(std::remove(v.begin(), v.end(), 2), v.end());
for (int i : v) {
std::cout << i << " ";
}
return 0;
}排序与复制
排序与复制操作包括排序、复制、合并等。
sort
sort函数用于对容器中的元素进行排序。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {3, 1, 2};
std::sort(v.begin(), v.end());
for (int i : v) {
std::cout << i << " ";
}
return 0;
}copy
copy函数用于从一个范围复制元素到另一个范围。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> src = {1, 2, 3};
std::vector<int> dest(src.size());
std::copy(src.begin(), src.end(), dest.begin());
for (int i : dest) {
std::cout << i << " ";
}
return 0;
}数值操作
数值操作包括生成、填充、累积等。
generate
generate函数用于生成一组随机数并填充容器。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
int main() {
std::vector<int> v(5);
std::generate(v.begin(), v.end(), []{ return rand() % 100; });
for (int i : v) {
std::cout << i << " ";
}
return 0;
}accumulate
accumulate函数用于计算容器中元素的总和。
// www.javascriptcn.com code example
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> v = {1, 2, 3};
int sum = std::accumulate(v.begin(), v.end(), 0);
std::cout << "元素之和: " << sum << "\n";
return 0;
}以上就是C++ STL的主要内容。通过学习和使用STL,我们可以大大提高编程效率,并写出更高质量的代码。希望读者能够深入理解和掌握STL的各个部分,以便更好地应用于实际项目中。