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

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日

相关文章

  • ubuntu下命令行播放器mplayer使用详解

    Ubuntu下命令行播放器mplayer使用详解 介绍 MPlayer是一个开源的,跨平台的,命令行的多媒体播放器。它支持几乎所有常见的音频和视频格式。在Ubuntu下,MPlayer是一个非常常用的命令行播放器。 本文将介绍如何在Ubuntu下使用MPlayer播放音频和视频文件。我们将讨论如何安装MPlayer,如何使用命令行启动MPlayer,并提供一…

    其他 2023年3月29日
    00
  • 侠盗猎车手5无法连接到网络怎么办 解决方法详解

    侠盗猎车手5无法连接网络的解决方法 问题描述 在游玩侠盗猎车手5的过程中,有些玩家可能会遭遇到无法连接到网络的问题,这个问题可能会导致玩家无法与其他玩家一起游戏,影响游戏体验。所以我们需要找到有效的解决方法,下面提供两种可行的解决方案。 方案一:检查网络连通性 首先我们需要检查我们的网络设置,确保我们的网络连接正常。操作步骤如下: 打开系统的“网络和共享中心…

    other 2023年6月27日
    00
  • iOS13.2 Beta1更新了什么 如何升降级 iOS13.2 beta1新特性与升降级全攻略

    iOS 13.2 Beta 1 更新内容 iOS 13.2 Beta 1 是苹果公司发布的 iOS 13.2 的测试版本之一。它带来了一些新特性和改进。以下是 iOS 13.2 Beta 1 的更新内容: Deep Fusion 技术:iOS 13.2 Beta 1 引入了 Deep Fusion 技术,这是一种图像处理技术,旨在提高 iPhone 11 系…

    other 2023年8月3日
    00
  • vue3封装侧导航文字骨架效果组件

    下面我将为大家详细讲解“vue3封装侧导航文字骨架效果组件”的完整攻略。 什么是侧导航文字骨架效果组件 侧导航文字骨架效果组件是指,在侧边栏导航菜单中,加载菜单项时显示的占位符效果,使用户可以更好地了解页面结构。该组件常用于减轻首屏加载时间而保持较好的用户体验。 组件实现方式 在vue3中,我们可以利用Composition API对组件进行封装。 代码示例…

    other 2023年6月25日
    00
  • Android那两个你碰不到但是很重要的类之ActivityThread

    ActivityThread是Android中非常重要的一个类,负责Android应用程序的启动、消息队列以及管理Activity的生命周期等核心功能。虽然ActivityThread类是Android源代码框架的一部分,但是它是隐藏在框架内部的,所以我们平常写代码的时候是无法直接调用它的。在本文中,我们将详细介绍如何了解并利用ActivityThread类…

    other 2023年6月27日
    00
  • 荣耀50怎么清理内存? 荣耀50手机内存不足的多种解决办法

    荣耀50怎么清理内存? 荣耀50是一款功能强大的智能手机,但有时候可能会遇到内存不足的问题。下面是一些清理内存的方法,帮助您解决荣耀50手机内存不足的问题。 1. 关闭不必要的后台应用程序 后台运行的应用程序会占用手机的内存资源。通过关闭不必要的后台应用程序,可以释放一部分内存空间。以下是关闭后台应用程序的步骤: 在荣耀50手机上,向上滑动屏幕,打开最近使用…

    other 2023年8月2日
    00
  • Vue中的基础过渡动画及实现原理解析

    Vue中的基础过渡动画及实现原理解析 1. 什么是过渡动画? 过渡动画是指在元素状态发生改变时,通过添加动画效果来平滑地过渡到新状态的一种动画效果。在Vue中,我们可以通过使用Vue的过渡动画进行元素的出现、消失、切换等动画效果的实现。 2. 基础过渡动画的使用 Vue提供了<transition>组件来实现基础的过渡动画效果。以下是基本用法: …

    other 2023年6月28日
    00
  • Android自定义View圆形百分比控件(一)

    Android自定义View圆形百分比控件(一)攻略 简介 在本攻略中,我们将学习如何创建一个自定义的圆形百分比控件,用于显示一个圆形进度条,并根据百分比值进行动态更新。 步骤 步骤一:创建自定义View类 首先,我们需要创建一个自定义的View类,用于绘制圆形进度条。以下是一个示例代码: public class CircleProgressBar ext…

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