首页 > 编程语言 >命名空间、STL、Lambda表达式与并发编程

命名空间、STL、Lambda表达式与并发编程

时间:2024-11-19 13:19:24浏览次数:3  
标签:std STL 编程 C++ int vector numbers include Lambda

       在深入学习C++的过程中,了解并掌握进阶特性对于编写高效、灵活的程序至关重要。

       本篇博客将详细介绍C++中的命名空间、标准模板库(STL)、lambda表达式、move语义及并发编程,帮助你更好地驾驭C++语言。

1. 命名空间(Namespace)

       命名空间用于组织代码,防止命名冲突。在大型项目中,不同模块可能会使用相同的函数名或变量名,通过引入命名空间可以避免这些冲突。

命名空间的定义和使用:

#include <iostream>

namespace Math {
    int add(int a, int b) {
        return a + b;
    }

    int subtract(int a, int b) {
        return a - b;
    }
}

int main() {
    std::cout << Math::add(5, 3) << std::endl;        // 使用Math命名空间的add函数
    std::cout << Math::subtract(5, 3) << std::endl;   // 使用Math命名空间的subtract函数

    return 0;
}

       你也可以使用using声明以便减少每次调用时的冗长代码:

using namespace Math;

       这样,你就不需要在每次调用函数时写Math::前缀。

2. 标准模板库(STL)

       STL是C++标准库中的核心部分,它提供了一系列用于处理数据结构和算法的模板类和函数。STL包括容器(如vectorlistmap等)、迭代器、算法(如排序、查找等)和函数对象。

2.1 容器(Containers)

       容器是存储和管理数据的类。例如,vector是一个动态数组,可以根据需要自动调整大小。

示例:使用vector容器:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    numbers.push_back(6);  // 添加元素到vector
    for (int num : numbers) {
        std::cout << num << " ";  // 输出所有元素
    }
    std::cout << std::endl;

    return 0;
}

2.2 迭代器(Iterators)

       迭代器是一种对象,用于遍历容器中的元素。C++标准库提供了多种类型的迭代器,如输入迭代器、输出迭代器、前向迭代器等。

示例:使用迭代器遍历vector

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::vector<int>::iterator it;

    for (it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";  // 使用迭代器访问元素
    }
    std::cout << std::endl;

    return 0;
}

2.3 常用算法

       STL提供了许多通用算法,如排序、查找、合并等,能够提高开发效率。

示例:使用sort算法:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 3};

    std::sort(numbers.begin(), numbers.end());  // 排序
    for (int num : numbers) {
        std::cout << num << " ";  // 输出排序后的元素
    }
    std::cout << std::endl;

    return 0;
}

3. Lambda表达式

       Lambda表达式是在C++11中引入的一种匿名函数,允许你在代码中定义简洁的内联函数,特别适用于简单的回调函数或算法操作。

示例:使用Lambda表达式进行排序:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 3};

    // 使用lambda表达式进行降序排序
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a > b;
    });

    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

       Lambda表达式的语法非常简洁,[]表示捕获列表,()中是参数,{}中是函数体。

4. Move语义与右值引用

       C++11引入了右值引用和move语义,用于优化对象的拷贝和移动操作。通过move语义,资源可以从一个对象移动到另一个对象,而不是简单地复制。

示例:使用std::move

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::vector<int> newNumbers = std::move(numbers);  // 移动而非拷贝

    std::cout << "newNumbers: ";
    for (int num : newNumbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    std::cout << "numbers: " << numbers.size() << std::endl;  // 被移动后numbers为空

    return 0;
}

       使用std::move可以避免不必要的深拷贝操作,特别是在处理大型数据时能够显著提高性能。

5. 并发编程

       并发编程允许程序同时执行多个任务,C++11引入了<thread>库来支持多线程操作,允许程序在多个处理器核心上并行执行。

示例:创建线程:

#include <iostream>
#include <thread>

void printMessage(const std::string& message) {
    std::cout << message << std::endl;
}

int main() {
    std::thread t1(printMessage, "Hello from thread 1");
    std::thread t2(printMessage, "Hello from thread 2");

    t1.join();  // 等待线程完成
    t2.join();

    return 0;
}

       使用std::thread可以轻松创建并管理线程。此外,C++还提供了诸如mutexcondition_variable等工具来处理线程同步问题。

总结

       C++的进阶特性为开发者提供了更多灵活高效的编程工具。从命名空间的使用、STL的强大能力,到lambda表达式的简洁、move语义的优化以及并发编程的多线程支持,这些特性为程序员带来了强大的力量。

       在开发中合理利用这些特性,不仅能够提高程序的性能,还能让代码更加简洁、可维护。

标签:std,STL,编程,C++,int,vector,numbers,include,Lambda
From: https://blog.csdn.net/byby0325_/article/details/143882373

相关文章

  • 并发编程体系概述
    作者:京东自有品牌周振类别定义特点应用场景Java中的使用进程(Process)计算机程序在操作系统中执行的实例-独立性强、拥有独立的内存空间、创建和销毁开销大-进程间通信复杂-独立的应用程序-高隔离性任务,如数据库服务器-Java应用程序运行在JVM进程中-通过Pr......
  • CH06_Lambda表达式
    第6章:Lambda表达式本章目标为什么要学习C#编程语言了解C#相关常识C#开发工具VisualStudio安装掌握C#程序的开发步骤掌握C#的注释掌握C#的常用转义符本章内容lambda表达式演变史C#匿名函数的演变历史可以追溯到C#语言的不同版本,随着语言特性的不断丰富......
  • CH09_网络编程
    第9章:网络编程本章目标熟悉网络编程相关协议了解TCP协议的通信原理了解UDP协议的通信原理掌握基于Socket方式的网络编程本章内容相关概念协议TCP协议:TCP是一种面向连接的、可靠的,基于字节流的传输层通信协议。为两台主机提供高可靠性的数据通信服务。它可......
  • 计算机学院的老师实际编程能力如何?
    计算机学院的教授,一般分为两派,一派是学院派,一派是技术派,国内学院派的老师一般都是从上学到工作都在学校,很少有老师真正去开发公司上过班,少部分老师有机会参与校企合作的项目,能够接触企业方面的技术,这样的老师理论能力很强,也就是写Paper的能力很强,但是编程能力确实欠缺。......
  • 【CUMT】《Java语言与网络编程》(张爱娟)部分课后简答题及答案参考
    chapter1.Java概述chapter2.基本程序设计chapter3.流程控制chapter4.面向对象与类chapter5.类的进阶设计chapter6.异常处理chapter7.常用类chapter9.线程与并发编程chapter11.网络编程chapter1.Java概述1.编写、运行Java程序的基本过程是怎样的?(1)在IDE中:用jav......
  • Wincc 7.5SP2下VBA编程批量设置变量线性标定
    继续学习wincc下面VBA编程,这个练习实现变量线性标定。在前面练习基础上做,有REAL1至REAL10共10个变量,通过VBA脚本对Real1至Real5设置线性标定。写下面的VBA脚本: SubSetTagScaleParameter()DimhmigoAshmigoDimstrTagNameAsStringDimiAsIntegerSethmigo=NewhmigoFo......
  • 一些值得注意的STL使用,用错了可能就复杂度错误了
    前言一些见到(或看到别人,或写了)的问题就记一下吧正文lower_boundSTL分为两类,一类是支持随机访问的,另一类是不支持随机访问的。而不支持随机访问的,若使用lower_bound函数,请一定要使用.....lower_bound(...),因为这样的复杂度是对的(\(\log\)),否则就是线性的。我在cpprefernce上......
  • vue2-组件化编程
    模块:向外提供特定功能的js呈现组件:用来实现局部(特定)功能效果的代码集合模块化:当应用中的js都以模块来编写的,那这个应用就是一个模块化的应用组件化:当应用中的功能都是多组件的方式来编写的,那这个应用就是一个组件化的应用编写组件-非单文件组件非单文件组......
  • 基于Select模型的通信仿真--win32编程代码
    目录基于Select模型的通信仿真--win32编程代码编程环境服务端客户端基于Select模型的通信仿真--win32编程代码编程环境VisualC++6.0服务端#include<stdio.h>#include<string.h>#include<WinSock2.h>#pragmacomment(lib,"ws2_32.lib")intAPIENTRYWinMain(HINSTANCEh......
  • 【JAVA】Java基础—面向对象编程:类的其他特性—静态成员与方法
    在Java中,静态成员和静态方法是类的一部分,而不是类的实例的一部分。这意味着静态成员和方法可以在没有创建类的实例的情况下访问。理解静态成员和方法的概念对于Java开发至关重要,因为它们在内存管理、性能优化和设计模式中扮演着重要角色。理论知识1.静态成员静态变量:也称......