首页 > 编程语言 >STL 以及 C语言与C++的区别

STL 以及 C语言与C++的区别

时间:2024-05-24 17:52:07浏览次数:24  
标签:容器 nums STL C++ C语言 vector include

C++语言的标准库(STL)

容器(Containers)

  • vector:动态数组,可以动态增长和收缩,支持快速随机访问元素。

  • list:双向链表,支持在任意位置快速插入和删除元素。

  • map:关联容器,以键值对(key-value)形式存储元素,支持快速查找和插入。

  • 竞赛常用C++ STL 用法 https://io.zouht.com/154.html

vector VS. list VS. deque:
a、若需要随机访问操作,则选择vector;
b、若已经知道需要存储元素的数目,则选择vector;
c、若需要随机插入/删除(不仅仅在两端),则选择list
d、只有需要在首端进行插入/删除操作的时候,还要兼顾随机访问效率,才选择deque,否则都选择vector。
e、若既需要随机插入/删除,又需要随机访问,则需要在vector与list间做个折中-deque。
f、当要存储的是大型负责类对象时,list要优于vector;当然这时候也可以用vector来存储指向对象的指针,
同样会取得较高的效率,但是指针的维护非常容易出错,因此不推荐使用。

示例:使用vector容器存储整数,并遍历输出

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 创建一个vector容器存储整数
    vector<int> nums;

    // 向vector容器中添加元素
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(3);
    nums.push_back(4);
    nums.push_back(5);

    // 遍历vector容器并输出元素
    for (int i = 0; i < nums.size(); ++i) {
        cout << nums[i] << " ";
    }
    cout << endl;

    return 0;
}

示例:使用map容器存储键值对,并遍历输出

#include <iostream>
#include <map>
using namespace std;

int main() {
    // 创建一个map容器存储键值对
    map<string, int> scores;

    // 向map容器中添加键值对
    scores["Alice"] = 90;
    scores["Bob"] = 85;
    scores["Charlie"] = 95;

    // 遍历map容器并输出键值对
    for (auto it = scores.begin(); it != scores.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    return 0;
}

算法(Algorithms)

  • sort:排序算法,用于对容器中的元素进行排序,如快速排序、归并排序等。
  • find:查找算法,用于在容器中查找特定值或满足条件的元素。

示例:使用sort算法对vector容器中的整数进行排序

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    // 创建一个vector容器存储整数
    vector<int> nums = {5, 2, 8, 1, 9, 3};

    // 使用sort算法对vector容器中的整数进行排序
    sort(nums.begin(), nums.end());

    // 输出排序后的结果
    for (int num : nums) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

示例:使用find算法在vector容器中查找指定元素

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    // 创建一个vector容器存储整数
    vector<int> nums = {5, 2, 8, 1, 9, 3};

    // 使用find算法在vector容器中查找指定元素
    int target = 8;
    auto it = find(nums.begin(), nums.end(), target);
    if (it != nums.end()) {
        cout << "Element found at index " << distance(nums.begin(), it) << endl;
    } else {
        cout << "Element not found" << endl;
    }

    return 0;
}

迭代器(Iterators)

  • 迭代器是一种用于遍历容器中元素的对象,类似于指针,可以按顺序访问容器中的元素。
  • 提供了多种类型的迭代器,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,支持不同类型的容器和操作。

其他

  • 函数对象(Functors):可调用对象,类似于函数指针,用于实现自定义的算法和操作。
  • 智能指针(Smart Pointers):用于管理动态分配的内存,如shared_ptr、unique_ptr和weak_ptr,提高了内存管理的安全性和可靠性。

STL的优势和作用

  • 提高了开发效率:STL提供了丰富的容器和算法,避免了重复实现常用的数据结构和算法,极大地提高了开发效率。
  • 提高了代码质量:STL中的容器和算法经过严格测试和优化,保证了其性能和稳定性,提高了代码的质量和可靠性。
  • 提供了统一的接口:STL中的容器和算法都遵循了统一的接口规范,使得不同的数据结构和算法可以方便地进行组合和替换,提高了代码的灵活性和可维护性。

综上所述,C++语言的标准库(STL)提供了丰富而强大的容器、算法和迭代器等组件,极大地提高了开发效率和代码质量,成为C++程序员不可或缺的利器。

C语言与C++的区别

C和C++是两种广泛使用的编程语言,它们有许多相似之处,但也存在一些显著的区别。以下是对它们的详细比较和描述。

1. 历史和发展背景

  • C语言:由丹尼斯·里奇(Dennis Ritchie)在1972年开发,是一种通用的过程式编程语言。C语言旨在提供一种简洁、高效的语言,用于系统编程和低级程序开发,如操作系统和嵌入式系统。
  • C++语言:由比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)在1979年开发,最初称为“C with Classes”。C++是在C的基础上扩展的,增加了面向对象编程(OOP)特性。C++是一种多范式语言,支持过程式编程、面向对象编程和泛型编程。

2. 编程范式

  • C语言:主要支持过程式编程(Procedural Programming),强调函数和过程调用,代码组织上以函数为基本单位。
  • C++语言:支持多种编程范式,包括过程式编程、面向对象编程(OOP)和泛型编程。面向对象编程引入了类、对象、继承、多态、封装等概念。

3. 数据类型和结构

  • C语言:提供基本数据类型(如int、char、float、double)和结构体(struct),支持共用体(union)和枚举(enum)。
  • C++语言:继承了C的所有数据类型,并增加了类(class)和模板(template)等高级数据结构。类和对象是C++面向对象编程的基础。

4. 内存管理

  • C语言:使用标准库函数如malloc、calloc、realloc和free进行动态内存分配和释放,手动管理内存。
  • C++语言:除了支持C语言的内存管理函数外,还引入了运算符new和delete用于动态内存分配和释放,更加简洁和安全。

5. 输入输出

  • C语言:使用标准输入输出库函数,如printf、scanf、fgets、fputs等。
  • C++语言:引入了标准输入输出流库,如iostream中的cin、cout、cerr等,提供了更高级和方便的输入输出操作。

6. 函数和方法

  • C语言:函数是独立的代码单元,通过函数指针实现回调或多态性。
  • C++语言:支持函数重载(Overloading)和内联函数(Inline Function)。类中的函数称为方法(Method),可以是成员函数、静态函数或虚函数(Virtual Function)。

7. 面向对象编程

  • C语言:不支持面向对象编程,但可以通过结构体和函数指针模拟。
  • C++语言:全面支持面向对象编程,引入了类(class)、对象(object)、继承(inheritance)、多态(polymorphism)和封装(encapsulation)等概念。

8. 泛型编程

  • C语言:没有直接支持泛型编程,可以通过宏定义和void指针实现有限的泛型操作。
  • C++语言:引入模板(template)机制,实现类型安全的泛型编程,支持函数模板和类模板。

9. 标准库

  • C语言:标准库相对简单,包括标准输入输出、字符串处理、数学运算、内存管理等基本功能。
  • C++语言:标准库(STL,Standard Template Library)更加丰富和强大,包含容器(如vector、list、map)、算法(如sort、find)、迭代器(Iterator)等,极大地提高了开发效率。

10. 异常处理

  • C语言:没有内置的异常处理机制,通常通过返回错误码或设置全局错误变量处理错误。
  • C++语言:引入了异常处理机制(try、catch、throw),提供结构化的错误处理方式。

11. 命名空间

  • C语言:没有命名空间,名称冲突需要通过命名约定或作用域规则避免。
  • C++语言:引入了命名空间(namespace),可以有效避免名称冲突,组织和管理代码更加灵活。
示例代码对比
C语言版本
#include <stdio.h>
#include <stdlib.h>

void printMessage() {
    printf("Hello, C!\n");
}

int main() {
    printMessage();
    return 0;
}
C++语言版本
#include <iostream>
using namespace std;

void printMessage() {
    cout << "Hello, C++!" << endl;
}

int main() {
    printMessage();
    return 0;
}
  • 在C++版本中,使用了iostream库和cout进行输出,而不是C语言的stdio.h库和printf函数。
  • namespace std的使用使得在使用cout和endl时不需要加std::前缀。

通过以上对比,可以看出C和C++在语法、功能和编程范式上的一些显著区别。C语言简洁高效,适用于系统编程和嵌入式开发;而C++则功能强大,支持多范式编程,适用于大型软件系统的开发。理解这些区别有助于在实际开发中选择合适的编程语言和工具。

标签:容器,nums,STL,C++,C语言,vector,include
From: https://www.cnblogs.com/zhouhongyuan/p/18209640

相关文章

  • c++ 设计模式:建造者模式
    建造者模式(BuilderPattern)是一种创建型设计模式,它允许你构造复杂对象步骤分解。你可以不同的步骤中使用不同的方式创建对象,且对象的创建与表示是分离的。这样,同样的构建过程可以创建不同的表示。举例说明:#include<iostream>//#include<map>//#include<stack>#include<......
  • C++友元和动态内存
    在C++中,友元机制允许一个类将其非公有成员的访问权限授予指定的函数或者类。然而,滥用友元会破坏封装性,导致可维护性和安全性问题。动态内存指的是在程序运行时分配和释放内存,通常通过使用new和delete操作符在C++中管理。下面是一个简单的例子,展示了如何在类中使用友元函数来访问......
  • C++/Qt桌面应用学习路线参考
    ......
  • c++对象存放区域
    在C++中,对象的存放位置通常取决于对象的生存周期和分配方式。C++中的对象可以存放在以下几个主要的内存区域:栈(Stack):自动变量和局部对象通常存储在栈上。栈是一种后进先出(LIFO)的数据结构,它由编译器自动管理,当函数调用结束时,栈上的局部对象会自动被销毁。堆(Heap):动态分配......
  • C++-函数
    函数(Function):是一个提前封装好的、可重复使用的、完成特定功能的独立代码单元。特点:提前封装、可重复使用的、完成特定功能将针对特定功能的、有重复使用需求的代码,提前封装到函数内,在需要的时候随时调用。基础函数语法return语句执行后,函数立刻结束函数不可定义在mai......
  • Educator:C++面向对象-STL实训
    第1关:病毒复制任务描述本关任务:设计一个病毒类。相关知识本关涉及到的内容如下:拷贝构造函数重载!=和==运算符拷贝构造函数当一个构造函数的唯一一个参数就是它所在类的引用时,这个构造函数就是一个拷贝构造函数编程要求设计一个病毒Virus类,它的内部有一个Gen变量,代表......
  • 浅谈C++函数
    目录一、函数的概念二、调用函数的两个前提三、函数传参的三种形式四、函数返回类型一、函数的概念函数是C++程序的基本模块,通常一个C++程序由一个或多个函数组成。函数可以完成用户指定的任务,一般分为库函数和用户自定义的函数。函数由函数头和函数体组成,函数头中包......
  • C语言 - 结构体转cha*
    c语言结构体转cha*在C语言中,将结构体转换为char*通常意味着你想要获取结构体的内存表示,并将其视为字符数组。这种转换可以通过使用memcpy函数来实现。下面是一个简单的例子,展示了如何将结构体转换为char*:#include<stdio.h>#include<stdlib.h>#include<string.h>......
  • 47.C语言函数练习题整理
    题目来自练习册和牛客网的一些编程题目整理函数都有返回值且只有一个返回值声明类型为void可以返回空值若调用一个函数中没有return语句返回一个不确定的值形参是动态变量实参和形参之间的数据传递方式为实参到形参的单向值传递形参的值发生改变不会影响主调函数中的......
  • C语言:动态内存管理的学习1
    动态内存管理本章重点为什么存在动态内存分配?动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误·几个经典的笔试题·柔性数组一.为什么存在动态内存分配?我们已经学到的开辟空间的方法:inta;intarr[100];单个开辟空间或者连续开辟空间;在数组的......