試圖接收一個具有未知大值的向量我想出了一個我認爲完全錯誤的解決方案:我認爲當std::vector<size_t>
的一個元素首先被分配給一個小值,然後被分配給一個大的元素時可能會出錯或數據丟失,因爲整個矢量的類型已經設置好,並且內存中的一些空間被排列。使用不同整數類型的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>
(發送給函數等)。
應該是安全的。 size_t實際上是uint32_t或uint64_t,或者甚至uint16_t取決於目標機器體系結構。 –