std::vector
の実装については、コンパイラ固有の理由で難しいです。コンパイル時に不明な要素を格納することができる非常に単純なクラスです。
#include <iostream>
class TrivialExtendableArray
{
public:
TrivialExtendableArray()
: internalStorage(nullptr),
size(0)
{
}
~TrivialExtendableArray()
{
if(internalStorage != nullptr)
{
delete []internalStorage;
}
}
TrivialExtendableArray(const TrivialExtendableArray&) = delete;
TrivialExtendableArray& operator=(const TrivialExtendableArray&) = delete;
int* getPointer()
{
return internalStorage;
}
size_t getSize()
{
return size;
}
void addElement(int newElementValue)
{
int* newStorage = new int[size+1];
std::copy(internalStorage, internalStorage + size, newStorage);
if(internalStorage != nullptr)
{
delete []internalStorage;
}
newStorage[size] = newElementValue;
size++;
internalStorage = newStorage;
}
const int* begin() const
{
return internalStorage;
}
const int* end() const
{
return internalStorage + size;
}
private:
int* internalStorage;
size_t size;
};
std::ostream& operator<<(std::ostream& out, const TrivialExtendableArray& array)
{
out << "{ ";
for(const int* i = array.begin(); i != array.end(); i++)
{
out << *i << " ";
}
return out << "}";
}
int main()
{
TrivialExtendableArray array;
std::cout << "Empty TrivialExtendableArray on stack sizeof: " << sizeof(array) << ": " << array << std::endl;
array.addElement(5);
std::cout << "TrivialExtendable with one element on stack sizeof: " << sizeof(array) << ": " << array << std::endl;
array.addElement(3);
std::cout << "TrivialExtendable with two elements on stack sizeof: " << sizeof(array) << ": " << array << std::endl;
array.addElement(3);
std::cout << "TrivialExtendable with three elements on stack sizeof: " << sizeof(array) << ": " << array << std::endl;
}
あなたは、私はそのような何か受け取った使用しているコンパイラおよびアーキテクチャによって異なる場合があり、このプログラムの結果:
$ ./a.out
Empty TrivialExtendableArray on stack sizeof: 16: { }
TrivialExtendable with one element on stack sizeof: 16: { 5 }
TrivialExtendable with two elements on stack sizeof: 16: { 5 3 }
TrivialExtendable with three elements on stack sizeof: 16: { 5 3 3 }
は、クラスのサイズが原因で毎回同じである
をTrivialExtendableArray
のオブジェクトは、割り当てられたメモリへのポインタとこのメモリのサイズを格納する必要があります。要素の数は、このクラスのフィールドのサイズを変更しません。
std::vector
は非常に似たアプローチを使用しています。したがって、オブジェクトを操作すると、std::vector
オブジェクトのサイズは変更されません。
異なるサイズのベクトル vの 'sizeof(v)'をチェックしてください。ベクトルは未定義の動作を使用していますか? –
juanchopanza
"size"は "sizeof"を意味しています。もしあなたが何をしていても、大きさは 'a'、' a'、 'a *'、 'a-> x'のいずれかに変わります。 –
@Someprogrammerdude私は5回あなたのコメントを読んだが、それでも私には意味がない。サイズは変わらないでしょうか? – user3188346