Hi,
Ususally when we deal with containers it is recommended that we prepare size of the container before filling it. For example instead of std::vector::push_back() it is recommended to preliminary resize it and setting values using square brackets std::vector<float> v[0] = 12.
I assume that when we deal with vtkFloatArray we should stick to the same idea.
I can see that there is a vtkFloatArray::Resize() method and vtkFloatArray::SetValue(vtkIdType, ValueType). I thought that vtkIdType is something like an index of a value but I noticed that there is a difference between vtkFloatArray::SetValue(vtkIdType, ValueType) and vtkFloatArray::InsertNextValue(ValueType). If the array is filled with SetValue method and I addd it to the vtkImageData then I get strange range of values something like max 1e308 and min -1e308 (that is why my Slicer app fails). Probably vtkIdType is not an index?
But if I use InsertNextValue(ValueType) then everything is fine until I watch the size of an array:
vtkNew<vtkFloatArray> array;
auto s = array->GetSize(); //gives 0
for (size_t z = 0; z < 10; z++){
for (size_t x = 0; x < 20; x++){
for (size_t y = 0; y < 30; y++){
array->InsertNextValue(x+y+z);
s = array->GetSize(); // gives 1, 3, 7 etc (why not 1, 2, 3, 4 ... ?)
}
}
}
// PS here I kept the idea of my code but some little things may differ like x,y,z ranges and assignement value (x+y+z)
The size of array increase nonlinearly… Why?
How should I fill the array and not loose perfomance?