c++ - 将 std::vector<size_t> 与不同的整数类型一起使用总是安全的吗?

标签 c++

试图接收一个具有未知大值的 vector ,我想出了一个我认为完全错误的解决方案:我认为当 std::vector<size_t> 的一个元素时首先分配给一个小值然后分配给一个大值可能会出现错误或数据丢失,因为整个 vector 的类型已经设置并且内存中的一些空间已经安排好了。

但是以下代码有效:

#include<vector>
#include<iostream>
#include<typeinfo>

int main(){

    std::vector<size_t> vec;

    // Fixing size and adding small number which 
    // I suppose would set type as a small one, 
    // i.e. int 
    vec.resize(2);
    int i = 0;
    std::fill(vec.begin(),vec.end(),i);    

    // add a big number that should not fit smaller type
    unsigned long long bignum = 18446744073709551614;
    vec.push_back(bignum);

    std::cout<<vec[0]<<" "<<vec[1]<<" "<<vec[2]<<std::endl;
    std::cout<<typeid(vec[0]).name()<<std::endl
    <<typeid(vec[1]).name()<<std::endl<<typeid(vec[2]).name()<<std::endl;

    // cell 0 was already initialized with int, trying to make oveflow
    vec[0] = 18446744073709551613;

    std::cout<<vec[0]<<" "<<vec[1]<<" "<<vec[2]<<std::endl;
    std::cout<<typeid(vec[0]).name()<<std::endl
    <<typeid(vec[1]).name()<<std::endl<<typeid(vec[2]).name()<<std::endl;

    return 1;   
}

但是,输出不包含类型名称,可能是因为我的编译器:

$ ./a.out
0 0 18446744073709551614
m
m
m
18446744073709551613 0 18446744073709551614
m
m
m

那么它对所有编译器是否安全,我可以自由地使用 vector::<size_t> 操作吗? (发送到函数等)当我不知道使用的整数类型时?

最佳答案

vector<size_t>表示一个 vector ,其条目都是 size_t .如果您尝试存储一个不是 size_t 的值, 它将被隐式转换为 size_t在存储之前。如果原始值是 [ 0 范围之外的整数,这可能会导致数据丢失。 , SIZE_MAX ].

您的问题表明您想象 vector 正在存储各种不同类型的对象,但这并没有发生。

备注:size_t通常表示最大可能的可分配单元的大小。也许最好使用一种更能反射(reflect)您存储的值来源的类型,例如uint64_t .

关于c++ - 将 std::vector<size_t> 与不同的整数类型一起使用总是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41214902/

相关文章:

c++ - 面试题接口(interface)实现

c++ - 以有状态策略类为代价解耦主机类和策略类,不遵循 Effective C++ 的第 26 条

c++ - 从C++函数中删除noexcept,如何处理调用它的noexcept函数?

c++ - 来自视频文件的垫子数组 - opencv

c++ - 搜索二叉搜索树

C++ 调整 std::string 使其最大大小为 16 字节

C++:结构命名标准

c++ - 这是 GCC 错误吗?使用 union 初始化结构

c++ - 每当我运行 C++ 中的乘法矩阵代码时,它总是崩溃。不知道为什么

c++ - 将传递的 ofstream 设置为类范围的变量