当前位置:首页 > 技术 > 正文内容

C++ 中数组的声明、初始化与常见操作实践

访客 技术 2026年8月8日 1

一维数组的基本用法

在 C++ 中,数组是一组相同类型元素的连续内存集合。定义时需指定类型和大小(编译期常量),例如:

#include <iostream>

int main() {
    int scores[12];           // 存储 12 个整数
    double weights[50];       // 50 个双精度浮点数
    char name[32];            // 最多容纳 31 字符 + '\0'
    return 0;
}

初始化策略

未显式初始化的局部数组内容不可预测;全局或静态数组默认为零值。支持多种初始化方式:

int nums1[4] = {10, 20, 30, 40};     // 显式全部赋值
int nums2[] = {5, 15, 25};              // 编译器推导长度为 3
int nums3[6] = {1, 2};                  // 剩余元素自动补 0 → {1,2,0,0,0,0}
char str[7] = "Hello";                  // 等价于 {'H','e','l','l','o','\0'},末尾隐含空字符

索引与元素访问

数组下标从 0 开始,越界访问不触发编译错误但属未定义行为。安全访问示例:

#include <iostream>

int main() {
    int data[3] = {100, 200, 300};
    std::cout << data[0] << " " << data[2] << "\n"; // 输出:100 300
    data[1] = 250; // 修改中间元素
    std::cout << data[1] << "\n"; // 输出:250
}

典型应用场景

  • 斐波那契数列第 n 项计算(n ≥ 0)
#include <iostream>

int main() {
    int N;
    std::cin >> N;
    long long fib[10001] = {0, 1}; // 初始化前两项

    for (int i = 2; i <= N; ++i) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    std::cout << fib[N] << "\n";
}
  • 逆序输出整数序列
#include <iostream>

int main() {
    int count;
    std::cin >> count;
    int values[1000];

    for (int i = 0; i < count; ++i) {
        std::cin >> values[i];
    }

    for (int i = count - 1; i >= 0; --i) {
        std::cout << values[i] << " ";
    }
    std::cout << "\n";
}
  • 循环右移 k 位(k ≤ n)
    利用三次翻转实现 O(n) 时间复杂度:
#include <iostream>

void reverse(int arr[], int start, int end) {
    while (start < end) {
        std::swap(arr[start], arr[end]);
        ++start;
        --end;
    }
}

int main() {
    int len, shift;
    std::cin >> len >> shift;
    int seq[1000];

    for (int i = 0; i < len; ++i) {
        std::cin >> seq[i];
    }

    // 右移k等价于:翻转[0,len-k), 翻转[len-k,len), 再翻转整个数组
    int pivot = len - shift % len;
    reverse(seq, 0, pivot - 1);
    reverse(seq, pivot, len - 1);
    reverse(seq, 0, len - 1);

    for (int i = 0; i < len; ++i) {
        std::cout << seq[i] << " ";
    }
    std::cout << "\n";
}
  • 简单选择排序(升序)
#include <iostream>

int main() {
    int size;
    std::cin >> size;
    int items[1000];

    for (int i = 0; i < size; ++i) {
        std::cin >> items[i];
    }

    for (int i = 0; i < size - 1; ++i) {
        int min_idx = i;
        for (int j = i + 1; j < size; ++j) {
            if (items[j] < items[min_idx]) {
                min_idx = j;
            }
        }
        std::swap(items[i], items[min_idx]);
    }

    for (int i = 0; i < size; ++i) {
        std::cout << items[i] << " ";
    }
    std::cout << "\n";
}
  • 大整数幂运算(2^N,N ≤ 10000)
    使用十进制数组模拟高精度乘法:
#include <iostream>
#include <vector>

int main() {
    int N;
    std::cin >> N;

    std::vector<int> digits = {1}; // 初始值为 1

    for (int i = 0; i < N; ++i) {
        int carry = 0;
        for (size_t j = 0; j < digits.size(); ++j) {
            int product = digits[j] * 2 + carry;
            digits[j] = product % 10;
            carry = product / 10;
        }
        while (carry) {
            digits.push_back(carry % 10);
            carry /= 10;
        }
    }

    for (auto it = digits.rbegin(); it != digits.rend(); ++it) {
        std::cout << *it;
    }
    std::cout << "\n";
}

二维及更高维数组

多维数组本质是"数组的数组"。声明格式为 type name[dim1][dim2]...,内存按行优先连续布局:

int matrix[3][4];                    // 3 行 × 4 列整型矩阵
double cube[2][3][4] = {};           // 全零初始化的三维数组
int grid[][3] = {{1,2,3}, {4,5,6}}; // 编译器推导第一维为 2

矩阵螺旋遍历(顺时针)

通过维护边界坐标控制遍历方向,避免额外标记数组:

#include <iostream>

int main() {
    int rows, cols;
    std::cin >> rows >> cols;
    int board[50][50];

    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            std::cin >> board[i][j];
        }
    }

    int top = 0, bottom = rows - 1;
    int left = 0, right = cols - 1;

    while (top <= bottom && left <= right) {
        // 上边:从左到右
        for (int j = left; j <= right; ++j) std::cout << board[top][j] << " ";
        ++top;

        // 右边:从上到下
        for (int i = top; i <= bottom; ++i) std::cout << board[i][right] << " ";
        --right;

        // 下边:从右到左(需再次判断)
        if (top <= bottom) {
            for (int j = right; j >= left; --j) std::cout << board[bottom][j] << " ";
            --bottom;
        }

        // 左边:从下到上
        if (left <= right) {
            for (int i = bottom; i >= top; --i) std::cout << board[i][left] << " ";
            ++left;
        }
    }
    std::cout << "\n";
}
标签: C++
返回列表

上一篇:AIX/Linux 系统性能监控工具详解

没有最新的文章了...

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。