c++ 如何将字符串向量传递给具有C样式的指向C字符串的指针参数的函数

laawzig2  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(110)

我需要调用下面的getList函数,它来自一个我无法更改的库。

#include <iostream>
#include <vector>
#include <string>

//function already exists in a separate library, can't be changed
void getList(const char* list[], int count){};

int main()
{
    std::vector<std::string> vectorOfStrings = {"123" , "abc", "def", "456"};
    
    //call getList and pass vectorOfStrings and vectorOfStrings.size()
    getList(/*convert std::vector<std::string> to const char** */, vectorOfStrings.size());
    
    return 0;
}

我已经问过类似的问题here并得到了答案,但我认为可能有一种C++的方法可以做到这一点。

vmdwslir

vmdwslir1#

使用std::vector<const char*>存储原始std::vector<std::string>中存储的字符串数据的指针。
这是一个快速操作,因为您要复制原始数据,但请注意:这要求传递给函数的const char*不存储在任何地方,因为一旦原始字符串被释放,它们将变为INVALID(您将得到未定义的行为)。

std::vector<std::string> strings = { "foo", "bar", "baz" };
std::vector<const char*> cstrings;
cstrings.reserve(strings.size());

std::transform(
    strings.begin(), 
    strings.end(), 
    std::back_inserter(cstrings), 
    [] (const auto& string) { return string.c_str();}
);

getList(cstrings.data(), cstrings.size());
txu3uszq

txu3uszq2#

由于vector元素不是C类型,因此需要构造一个数组传递给函数:

const char **a = new const char *[vectorOfStrings.size()];
for (int i=0;i<vectorOfStrings.size();i++) {
    a[i] = vectorOfStrings[i].c_str();
}
getList(a, vectorOfStrings.size());
delete[] a;

或者,用更接近C++的方式:

std::vector<const char *> v2;
for (int i=0;i<vectorOfStrings.size();i++) {
    v2.push_back(vectorOfStrings[i].c_str());
}
getList(v2.data(), vectorOfStrings.size());

相关问题