【C++基础STL1】数组和vector

一、C和C++的区别

  1. 数组定义
    C语言: 数组的大小必须是常量表达式,不能在运行时动态改变。C99标准引入了可变长度数组(VLA),允许在函数调用时确定数组的大小,但这并不是所有编译器都支持的特性。
    C++语言: 数组的大小同样必须是常量,但C++引入了std::array和std::vector等容器,提供了更灵活的数组管理方式。std::vector允许动态调整大小,适合需要动态数组的场景。
  2. 数组初始化
    C语言: 数组初始化时,必须指定数组的类型和大小,且不能在初始化时省略维度。初始化时,如果指定的元素个数少于数组大小,剩余部分会被初始化为0。
    C++语言: C++允许在初始化时省略数组的维度,编译器会根据初始值的数量推断出维度。
  3. 内存管理
    C语言: 使用malloc和free进行动态内存分配和释放,数组的内存管理相对简单,但需要手动管理内存,容易出现内存泄漏或越界问题。
    C++语言: 使用new和delete进行动态内存分配和释放,C++提供了更强大的内存管理功能,支持对象的构造和析构。
  4. 数组的特性
    C语言: 数组名可以被视为指向数组首元素的指针,但不能直接进行指针运算。数组不支持拷贝和赋值操作。
    C++语言: C中的数组同样可以被视为指针,但C提供了更多的容器类(如std::vector),使得数组的操作更加灵活和安全。

二、C初始化数组

  1. 数组的本质

    数组是 "相同数据类型 + 连续内存地址" 的集合,用于解决 "批量存储同类型数据" 的问题。

    场景示例:统计全班 40 名学生的成绩,若用单个变量定义(score1、score2...score40),会导致定义繁琐、操作重复;用数组int score40即可一次性声明,配合循环高效处理。

  2. 数组的核心特点

    数据类型统一:所有元素必须是同一类型(如 int、float);

    内存地址连续:相邻元素的内存地址相差一个数据类型的大小(如 int 数组相邻元素差 4 字节);

    长度固定:数组长度一旦定义无法修改,需提前规划存储容量。

  3. 声明定义

c 复制代码
int arr[10];//隐式初始化为0
  1. 初始化
    (a) 有大小也有元素具体值
c 复制代码
//显式赋值 
int arr[10]={0};
int arr[10]={1,2,3,4,5,6,7,8,9,10};
// 部分初始化:未赋值元素默认补0
int num3[5] = {1,2,3}; // 等价于{1,2,3,0,0}

(b) 有所有元素可以忽略大小

c 复制代码
int a[]={1,2,3,4,5}

© 索引指定 (初始化后?不是必须初始化为0吧)赋值

c 复制代码
//数组定义后不能直接用{}批量赋值,需通过数组下标逐个操作:

int num6[5];
// 错误写法:定义后不能用{}批量赋值(编译报错)
// num6 = {1,2,3,4,5}; 
 
// 正确写法:通过下标逐个赋值(下标从0开始)
num6[0] = 1;
num6[1] = 2;
num6[2] = 3;
num6[3] = 4;
num6[4] = 5;

注意点

(1) 下标越界(最常见错误)

(2) 动态数组初始化错误

动态输入长度的数组(如int numn),定义时不能同时用{}初始化,需定义后通过循环或下标逐个赋值。

c 复制代码
int n;
scanf("%d", &n);
// 错误:动态数组不能直接初始化
int num[n] = {1,2,3}; 

(3) 定义后批量赋值错误

数组定义后不能用{}批量赋值,只能逐个下标操作

c 复制代码
int num[5];
// 错误:编译报错(expected expression before '{' token)
num = {1,2,3,4,5}; 

三、C++使用vector

cpp 复制代码
//写题中摘取部分
int T;
    cin >> T;
    
    while (T--) {
        int N;
        cin >> N;
        vector<int> x(N);//初始化
        for (int i = 0; i < N; i++) {
            cin >> x[i];
        }

参考文献:

1百度

2https://blog.csdn.net/2301_78592402/article/details/156576908

相关推荐
键盘会跳舞13 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
HugoStudio_SWAN13 小时前
洛谷 P10719 \[GESP202406 五级] 黑白格——暴力美学与图像处理的最小外接矩形
c++·图像处理·人工智能·学习·程序人生·算法·目标跟踪
jimy113 小时前
C++ 的 “移动语义”——Move Semantics
开发语言·c++
励志不掉头发的内向程序员16 小时前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互
OPEN-F16 小时前
ROS2系列教程:Gazebo插件(关节控制/IMU/激光雷达)
c++·python·数码相机·算法·机器人
蒸蒸yyyyzwd16 小时前
cpp 选手秋招学习笔记 day27
服务器·c++·面试·八股
haolin123.16 小时前
STL vector底层揭秘:从构造到迭代器失效
开发语言·c++·算法
尘中远17 小时前
给C++工业软件搭建 Agent
开发语言·c++·qt·ai·agent
2401_8685347817 小时前
网规备考_2.4 路由协议
c++·设计模式
啦啦啦啦啦zzzz17 小时前
自定义日志缓冲区(上)c++20
linux·服务器·c++·网络编程