C++11 & 14-STL要点汇总
概述
STL(Standard Template Library)是C++标准库中的重要组成部分,其提供了丰富且高效的数据结构和算法,包括但不限于容器、迭代器、算法等。C++11和14标准引入了一系列新的特性及语法,使得STL更加强大和易用。
本文将对C++11和14-STL的新增内容进行汇总,包括但不限于:
- 容器新增功能:
std::unordered_map
、std::unordered_set
、std::array
等; - 容器元素访问:
std::tie
、std::get
、std::ignore
等; - 迭代器新增功能:
std::begin
、std::end
、std::next
、std::prev
等; - 函数对象:lambda表达式、
std::function
等; - 算法新增功能:
std::for_each
、std::generate
、std::copy
等。
容器新增功能
std::unordered_map 和 std::unordered_set
std::unordered_map
和std::unordered_set
是C++11标准新增的两种容器,它们基于哈希表实现,可以在 $O(1)$ 时间复杂度下进行查找、插入和删除等操作。
以下是一个std::unordered_map
的示例:
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> myMap{ {1, "one"}, {2, "two"}, {3, "three"} };
for (const auto& [key, value] : myMap) {
std::cout << key << ": " << value << std::endl;
}
return 0;
}
输出:
1: one
2: two
3: three
std::array
std::array
是C++11标准新增的一种容器,它在使用上类似于数组,但是具有以下优势:
- 支持遍历;
- 支持
size()
方法获取数组大小; - 支持常规的STL算法。
以下是一个std::array
的示例:
#include <iostream>
#include <array>
int main() {
std::array<int, 3> myArray{ 1, 2, 3 };
for (const auto& element : myArray) {
std::cout << element << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3
容器元素访问
std::tie
std::tie
可以用于对多个变量进行解构(destructure),即将多个变量分别赋值,其中的被解构变量必须是pair类型,帮助我们更方便地访问pair类型元素。
以下是一个std::tie
的示例:
#include <iostream>
#include <tuple>
#include <string>
#include <utility>
int main() {
std::pair<int, std::string> myPair{ 1, "one" };
auto [key, value] = myPair;
std::cout << key << ": " << value << std::endl;
auto [tupleKey, tupleValue] = std::make_pair(2, "two");
std::tie(tupleKey, std::ignore) = std::make_pair(3, "three");
std::cout << tupleKey << ": " << tupleValue << std::endl;
return 0;
}
输出:
1: one
3: two
std::get
std::get
可以用于获取pair、tuple等STL容器的元素。
以下是一个std::get
的示例:
#include <iostream>
#include <pair>
#include <tuple>
int main() {
std::pair<int, std::string> myPair{ 1, "one" };
std::cout << std::get<0>(myPair) << std::endl;
std::cout << std::get<1>(myPair) << std::endl;
std::tuple<int, std::string, double> myTuple{ 1, "one", 1.0 };
std::cout << std::get<1>(myTuple) << std::endl;
std::cout << std::get<double>(myTuple) << std::endl;
return 0;
}
输出:
1
one
one
1
std::ignore
std::ignore
可以用于忽略pair、tuple等STL容器的元素。
以下是一个std::ignore
的示例:
#include <iostream>
#include <tuple>
int main() {
std::tuple<int, std::string, double> myTuple{ 1, "one", 1.0 };
auto [tupleKey, std::ignore, tupleValue] = myTuple;
std::cout << tupleKey << ": " << tupleValue << std::endl;
return 0;
}
输出:
1: 1
迭代器新增功能
std::begin 和 std::end
std::begin
和std::end
可以用于获取STL容器的起始迭代器与尾部迭代器。
以下是一个std::begin
和std::end
的示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector{ 1, 2, 3, 4 };
for (auto it = std::begin(myVector); it != std::end(myVector); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4
std::next 和 std::prev
std::next
和std::prev
可以用于获取一个迭代器的下一个或上一个迭代器。
以下是一个std::next
和std::prev
的示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector{ 1, 2, 3, 4 };
auto it = std::begin(myVector);
std::cout << *std::next(it, 2) << std::endl;
it = std::end(myVector);
std::cout << *std::prev(it, 2) << std::endl;
return 0;
}
输出:
3
3
函数对象
Lambda 表达式
Lambda表达式可以方便地使用匿名函数,用来替代显式定义的函数对象。
以下是一个Lambda表达式的示例:
#include <iostream>
int main() {
auto hello = []() { std::cout << "Hello, world!" << std::endl; };
hello();
return 0;
}
输出:
Hello, world!
std::function
std::function
是函数的封装器,可以存储任何可调用对象(callable object),包括函数指针、Lambda表达式等。
以下是一个std::function
的示例:
#include <iostream>
#include <functional>
int add(int a, int b) {
return a + b;
}
int main() {
std::function<int(int, int)> myFunction = add;
std::cout << myFunction(1, 2) << std::endl;
myFunction = [](int a, int b) { return a * b; };
std::cout << myFunction(2, 3) << std::endl;
return 0;
}
输出:
3
6
算法新增功能
std::for_each
std::for_each
可以对序列中的每个元素执行一个函数。
以下是一个std::for_each
的示例:
#include <iostream>
#include <vector>
#include <algorithm>
void print(int value) {
std::cout << value << " ";
}
int main() {
std::vector<int> myVector{ 1, 2, 3, 4 };
std::for_each(std::begin(myVector), std::end(myVector), print);
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4
std::generate
std::generate
可以用于生成序列中的每个元素。
以下是一个std::generate
的示例:
#include <iostream>
#include <vector>
#include <algorithm>
int increment() {
static int i = 0;
return ++i;
}
int main() {
std::vector<int> myVector(4);
std::generate(std::begin(myVector), std::end(myVector), increment);
for (const auto& element : myVector) {
std::cout << element << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4
std::copy
std::copy
可以将一个序列赋值到另一个序列中。
以下是一个std::copy
的示例:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> fromVector{ 1, 2, 3, 4 };
std::vector<int> toVector(fromVector.size());
std::copy(std::begin(fromVector), std::end(fromVector), std::begin(toVector));
for (const auto& element : toVector) {
std::cout << element << " ";
}
std::cout << std::endl;
return 0;
}
输出:
1 2 3 4
结论
至此,我们对C++11和14-STL的主要新增内容及其示例进行了全面总结,可以有效地理解和运用这些新增功能。需要注意的是,本文只是对新增内容进行了简单示例,大家还需详细学习和深入理解这些新增功能的实现原理和更多用法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++11&14-STL要点汇总 - Python技术站