Beim Versuch, einen Vektor mit unbekannten großen Werten zu erhalten, kam ich auf eine Lösung, die ich für völlig falsch hielt: Ich vermute, wenn ein Element der std::vector<size_t>
zuerst einem kleinen Wert zugeordnet wird und dann einem großen, könnte ein Fehler vorliegen oder Datenverlust, weil der Typ für den gesamten Vektor bereits festgelegt wurde und etwas Speicherplatz im Speicher angeordnet wurde.Ist es immer sicher, std :: vector mit verschiedenen Integer-Typen zu verwenden?
jedoch der folgende Code funktioniert:
#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;
}
Allerdings ist der Ausgang nicht Typnamen enthalten, vielleicht wegen meiner Compiler:
$ ./a.out
0 0 18446744073709551614
m
m
m
18446744073709551613 0 18446744073709551614
m
m
m
So ist es sicher für alle Compiler und kann ich frei mit vector::<size_t>
arbeiten (an Funktionen senden, usw.), wenn ich die verwendeten Integertypen nicht kenne?
sollte sicher sein. size_t ist eigentlich uint32_t oder uint64_t oder sogar uint16_t hängt von der Zielrechnerarchitektur ab. –