如果知道data
的大小,则可以从vvp.at(0)
构造第19行的vf
。
#include <iostream>
#include <vector>
typedef void* VoidPointer;
typedef std::vector< float > VF;
typedef std::vector< VoidPointer > VVP;
int main(int argc, char** argv)
{
VF vf;
vf.push_back(13.0f);
vf.push_back(14.0f);
vf.push_back(15.0f);
vf.push_back(16.0f);
VVP vvp;
vvp.push_back( (VoidPointer)const_cast<float *>( &(vf.front()) ) );
VF data ( static_cast< float* >( vvp.at(0) ),
static_cast< float* >( vvp.at(0) ) + vf.size() );
std::cout << "data.size() is " << data.size() << std::endl;
for(VF::const_iterator i = data.begin(); i != data.end(); ++i)
{
std::cout << "data contains " << *i << std::endl;
}
return 0;
}
抛开这是否明智(这个例子是人为的),如果我不知道
vvp.at(0)
的大小,我想知道如何将std::vector<float>
转换为vf
。我在想类似的东西:std::vector<float> data( *static_cast< std::vector<float>* >( vvp.at(0) ) );
但这导致程序终止于std::bad_alloc,如果需要的话,我不介意进行复制。
最佳答案
这不是从vvp.at(0)
转换为 vector ,而是浮点数组到新 vector 的副本。而且您无法在不知道长度的情况下进行复制。您仅保存了指向第一个元素的指针,因此信息丢失了。
您可以制作std::vector<std::pair<VoidPointer, size_t> > VVP
并保存&vf.front()
和vf.size()
(或者,如果愿意,可以保存开始和结束指针)。
您可以制作std::vector<VF *>
并存储指向 vector 的指针(即vvp.push_back(&vf)
),现在完全没有强制转换。
编辑:如果您没有意识到:指针&vf
与&vf.front()
无关。 vf
是一个包含指针&vf.front()
(或获取它的方法)的结构。仅地址&vf.front()
中没有任何信息可让您查找&vf
。