c++11&14-STL要点汇总

yizhihongxing

C++11 & 14-STL要点汇总

概述

STL(Standard Template Library)是C++标准库中的重要组成部分,其提供了丰富且高效的数据结构和算法,包括但不限于容器、迭代器、算法等。C++11和14标准引入了一系列新的特性及语法,使得STL更加强大和易用。

本文将对C++11和14-STL的新增内容进行汇总,包括但不限于:

  1. 容器新增功能:std::unordered_mapstd::unordered_setstd::array等;
  2. 容器元素访问:std::tiestd::getstd::ignore等;
  3. 迭代器新增功能:std::beginstd::endstd::nextstd::prev等;
  4. 函数对象:lambda表达式、std::function等;
  5. 算法新增功能:std::for_eachstd::generatestd::copy等。

容器新增功能

std::unordered_map 和 std::unordered_set

std::unordered_mapstd::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标准新增的一种容器,它在使用上类似于数组,但是具有以下优势:

  1. 支持遍历;
  2. 支持size()方法获取数组大小;
  3. 支持常规的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::beginstd::end可以用于获取STL容器的起始迭代器与尾部迭代器。

以下是一个std::beginstd::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::nextstd::prev可以用于获取一个迭代器的下一个或上一个迭代器。

以下是一个std::nextstd::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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • javascript实现快速排

    javascript实现快速排 快速排序(Quick Sort)是一种常见的排序算法,其核心思想是通过分治的方式逐步缩小待排序的序列范围,从而实现排序。下面我们使用 JavaScript 实现一个快速排序算法。 算法思想 快速排序的算法过程如下: 选择一个基准元素,将它放在序列的正确位置上; 将序列分为左右两部分,其中左边部分的元素都小于基准元素,右边部分的…

    其他 2023年3月28日
    00
  • 关于通过Java连接mysql对反斜杠”\“转义的测试详解

    很抱歉,由于我是一个文本模型,无法提供标准的markdown格式文本。但是我可以为您提供一个关于通过Java连接MySQL对反斜杠进行转义的测试详解的攻略,包含两个示例说明: 1. 使用PreparedStatement进行转义 在Java中,可以使用PreparedStatement来执行SQL语句,并自动对特殊字符进行转义。示例代码如下: String …

    other 2023年10月17日
    00
  • js实现右键菜单功能

    下面是JS实现右键菜单功能的完整攻略: 准备工作 在实现右键菜单前,请确保你已经具备以下知识: HTML基础知识,包括标签和属性的使用。 CSS样式和选择器,能够对网页进行美化。 JavaScript基础知识,包括变量、函数、DOM操作等。 实现步骤 HTML结构 首先,在页面中添加一个上下文菜单的容器元素,例如: <div class="m…

    other 2023年6月27日
    00
  • 14款优秀的javascript调试工具大盘点

    以下是14款优秀的JavaScript调试工具的攻略,包括功能介绍、使用方法和示例说明。 1. Chrome DevTools Chrome DevTools是Chrome浏览器自带的调试工具,可以用于调JavaScript、CSS和HTML。它提供了丰富的功能,包括代码调试、性能分析、网络监控等。 使用方法:在Chrome浏器中按下F12键或右键点击页面并…

    other 2023年5月7日
    00
  • 逆转交替合并两个链表的解析与实现

    逆转交替合并两个链表是一种常见的链表操作,该操作的意义在于将两个链表中的节点按照交替顺序进行组合,并将最终的结果链表逆序排列。下面是逆转交替合并两个链表的解析与实现的详细攻略: 解析 假设我们要对以下两个链表进行逆转交替合并: 链表1:1 -> 2 -> 3 -> 4 -> NULL链表2:5 -> 6 -> 7 -&gt…

    other 2023年6月27日
    00
  • mysql之slowlog慢查询日志

    mysql之slowlog慢查询日志 MySQL是目前广泛使用的关系型数据库管理系统之一,但是在处理大量数据时,会出现慢查询的情况,导致数据库性能下降,影响网站的正常运行。MySQL提供了一个慢查询日志机制,用于记录慢查询的SQL语句,可以通过分析慢查询日志找出性能瓶颈并进行优化。 开启慢查询日志 要开启MySQL的慢查询日志,需要在MySQL服务器配置文件…

    其他 2023年3月28日
    00
  • JAVA编程实现随机生成指定长度的密码功能【大小写和数字组合】

    当然!下面是关于\”JAVA编程实现随机生成指定长度的密码功能【大小写和数字组合】\”的完整攻略: JAVA编程实现随机生成指定长度的密码功能【大小写和数字组合】 在JAVA中,可以使用随机数生成器和字符集来实现随机生成指定长度的密码。以下是两个示例: 示例1:生成指定长度的密码 import java.util.Random; public class P…

    other 2023年8月19日
    00
  • 岳麓山风景名胜区-景点介绍

    岳麓山风景名胜区-景点介绍攻略 岳麓山风景名胜区位于湖南省长沙市岳麓区,是中国著名的风景区之一。本文将详细介绍岳麓山风景名胜区的景点介绍,包含两个示例说明。 1. 景点介绍 1.1. 橘子洲头 橘子洲头位于岳麓山风景名胜区的湖岸边,是长沙市的标志性景点之一。这里有美丽的湖景和独特的文化氛围,游客拍照和休闲的好去处。 1.2. 岳麓书院 岳麓书院是中国历史上著…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部