C++之size_t

size_t 是 C++ 中的一个无符号整型,用于表示对象的大小或容器中的元素数量,在cstddef头文件中定义了size_t类型。它通常用于数组索引和内存分配。其大小取决于平台(通常是 32 位或 64 位),因此在处理大数据时比 int 更安全。


特点

  1. 无符号类型:size_t 只能表示非负数,适合表示数组索引和容器大小。

  2. 平台依赖:其大小取决于编译器和平台,通常在 32 位系统上为 4 字节,在 64 位系统上为 8 字节。


示例

  1. 数组索引
    在处理数组时,使用 size_t来定义索引和大小是个好习惯:

    #include <iostream>
    
    int main() {
        const size_t arraySize = 5;
        int arr[arraySize] = {1, 2, 3, 4, 5};
    
        for (size_t i = 0; i < arraySize; ++i) {
            std::cout << arr[i] << " ";
        }
        std::cout << std::endl;
        return 0;
    }
    
    
  2. 动态内存分配

    在动态分配内存时,size_t 用于指定分配的字节数:

    #include <iostream>
    #include <cstdlib> // 包含 malloc 和 free
    
    int main() {
        size_t numElements = 10;
        int* arr = static_cast<int*>(malloc(numElements * sizeof(int))); // 使用 size_t
    
        if (arr != nullptr) {
            for (size_t i = 0; i < numElements; ++i) {
                arr[i] = i * 10;
                std::cout << arr[i] << " ";
            }
            std::cout << std::endl;
            free(arr); // 释放内存
        }
        return 0;
    }
    

总结

size_t 是一个用于表示大小和索引的安全选择,能够避免负值问题,特别是在处理大型数据集时非常有用。

补充1

%zd 是 C 和 C++ 中格式化输出的一个占位符,用于打印 size_t 类型的变量。它通常用于 printffprintf 等函数中。

详细解释

  • z:表示对应的参数类型是 size_t。size_t 是一种无符号整数类型,通常用于表示对象的大小或数组的索引。它的大小在不同的平台上可能有所不同,通常是与机器架构相关的(例如,32 位系统通常为 4 字节,64 位系统为 8 字节)。

  • d:表示输出为十进制整数。

举一个例子

#include <stdio.h>

int main() {
    size_t size = 42; // 定义一个 size_t 类型的变量
    printf("The size is: %zd\n", size); // 使用 %zd 打印 size
    return 0;
}

输出如下:

img

总结

%zd 是一种用于安全和正确地输出 size_t 类型变量的格式说明符,确保在不同平台上都能正确显示 size_t 的值。

补充2

size_tsize_type 都是表示大小(如数组长度、容器大小)的一种数据类型,但它们不是完全相同的东西:

  • size_t:

    是 C/C++ 标准库中定义的一个类型,表示无符号整数类型,通常用于表示对象大小或数组索引。size_t 定义在 <stddef.h><cstddef> 头文件中,由编译器定义,通常是 unsigned int 或 unsigned long。它的大小和具体的类型会根据平台的不同而有所变化。size_t 用于标准库函数中,比如 sizeof 返回的就是 size_t 类型。

    补充一张图:

    img

  • size_type:附上几张图

    img

    比如:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string s("some string");
        for (decltype(s.size()) index = 0; index != s.size() && !isspace(s[index]); ++index)
            s[index] = toupper(s[index]);	// 将当前字符改成大写形式
            
        cout << s << endl;
        return 0;
    }
    

    输出如下:

    img

    img

    比如:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        vector<int> vInt;
        int iVal;
        cout << "请输入一组数字:" << endl;
        while (cin >> iVal)
            vInt.push_back(iVal);
        if (vInt.size() == 0)
        {
            cout << "没有任何元素" << endl;
            return -1;
        }
        cout << "相邻两项的和依次是:" << endl;
        // 利用 decltype 推断 i 的类型
        for (decltype(vInt.size()) i = 0; i < vInt.size() - 1; i += 2)
        {
            // 求相邻两项的和
            cout << vInt[i] + vInt[i + 1] << " ";
            // 每行输出 5 个数字
            if ((i + 2) % 10 == 0)
                cout << endl;
        }
        // 如果元素数是奇数,单独处理最后一个元素
        if (vInt.size() % 2 != 0)
            cout << vInt[vInt.size() - 1];
        return 0;
    }
    

    输出如下:

    img

posted @   hisun9  阅读(483)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示