试图接收一个具有未知大值的 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/