哪个C ++ std集合最适合创建C样式数组(Foo *)?

时间:2015-12-01 17:09:12

标签: c++ arrays std

我正在使用的外部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);
}

1 个答案:

答案 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());
}