我正在使用的外部API需要C风格的对象数组:
// Some api function
void doStuff(const Foo* objects, size_t length);
实际上,API会使用int
作为长度,但这会让情况变得更糟。在创建对象数组时,我不知道我有多少,因为有些错误:
void ObjManager::sendObjectsToApi(const std::list<const std::string>& names)
{
// Create the most suitable type of connection
std::????<Foo> objects;
// Loop names, try to create object for every one of them
for( auto i=names.begin(), l=names.end(); i<l; i++ ) {
Foo obj = createFooWithName(*i);
if( obj.is_valid() ) {
objects.addToCollection( obj );
}
}
// Convert collection to C style array
size_t length = objects.size();
Foo* c_objects = objects.toC_StyleArray();
API::doStuff(c_objects, length);
}
答案 0 :(得分:3)
如果doStuff
需要数组,那么我会使用std::vector
,然后使用data()
从向量中获取数组。
std::vector<Foo> temp(names.begin(), names.end());
doStuff(temp.data(), temp.size());
std::vector
保证数据将连续存储。
以上是您要从std::list
直接复制到std::vector
。我是你的情况,因为你循环遍历列表的内容并创建新对象,那么你将有
void ObjManager::sendObjectsToApi(const std::list<const std::string>& names)
{
// Create the most suitable type of connection
std::vector<Foo> objects;
objects.reserve(names.size()); // allocate space so we only allocate once
// Loop names, try to create object for every one of them
for( auto i=names.begin(), l=names.end(); i<l; i++ ) {
Foo obj = createFooWithName(*i);
if( obj.is_valid() ) {
objects.push_back( obj );
}
}
// Convert collection to C style array
API::doStuff(names.empty()? nullptr : objects.data(), objects.size());
}