使用具有不同整数类型的 std::vector 是否始终安全<size_t>?

Is it always safe to use std::vector<size_t> with different integer types?

本文关键字:lt 安全 size gt vector 整数 std 类型 是否      更新时间:2023-10-16

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

但是,以下代码有效:

#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>是指向量,其条目都是 size_t。如果您尝试存储不是size_t的值,则将其隐式转换为size_t。如果原始值是[0SIZE_MAX]范围之外的整数。

,这可能涉及数据丢失。

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

注意:size_t通常表示最大的可分配单元的大小。也许最好使用更多反映您正在存储的值的源的类型,例如uint64_t

在@stargateur的答案中,最好的便携式下注是intmax_tuintmax_t。它们可以保证是平台上可用的最大整数类型。

可能还可能有编译器特定的扩展名,例如__int128_t。此答案提供了有关海湾合作委员会中128位内置的一些信息。请注意,std::intmax_t将为64位。

不,这不是安全的。

这只是工作,因为您放了int >= 0size_tunsigned,因此,如果您尝试放置负值,则会有negative_value % 2**n,其中n是用于表示无符号类型的位数。


您向量的元素是size_t。使用i填充它时,您要求编译器将int施放到size_t中。这不是"安全"。


vec[0] = 18446744073709551613;

在这里这是安全的,因为VEC [0]是size_t


注意size_t旨在处理...大小。因此,无法固定可以处理size_t的最大值。如果您想要库存整数。使用<cstdint>