C++:vector<string> 到 char**

标签 c++ vector

<分区>

我正在将我的应用程序转换为能够用作库。为此,我想提供将字符串 vector 传递给库的默认运行例程的可能性。

我遇到的问题实际上是创建char**。这是我当前的实现,在源代码中被注释掉了,因为它不起作用:

IceTea* IceTea::setupCli(vector<string> strings) {
    int argc=strings.size(), i=0;
    char* argv[argc];
    vector<string>::iterator it;
    for(it=strings.begin(); it != strings.end(); ++it) {
        argv[i++] = (char*)it->c_str();
    }

    // Pass the char** to the original method.
    return this->setupCli(argc, argv);
}

我得到的错误:

src/IceTea.cpp:132:18: error: no matching member function for call to 'setupCli'
    return this->setupCli(argc, argv);
           ~~~~~~^~~~~~~~
src/IceTea.h:44:13: note: candidate function not viable: no known conversion from 'char *[argc]' to 'const char **' for 2nd argument
    IceTea* setupCli(int, const char**);
            ^
src/IceTea.cpp:124:17: note: candidate function not viable: requires single argument 'strings', but 2 arguments were provided
IceTea* IceTea::setupCli(vector<string> strings) {

最佳答案

恐怕您无法转换 vector<string>char**在恒定的时间。 vector<string>可以转换为string*很容易,而且string可以转换为char*很容易,但 vector 不能转换为 char** .实际上,这个问题与为什么 int[10][20] 非常相似。不能简单地转换为 int** .

现在,如果你绝对必须这样做,那么

vector<char*> pointerVec(strings.size());
for(unsigned i = 0; i < strings.size(); ++i)
{
    pointerVec[i] = strings[i].data();
} //you can use transform instead of this loop
char** result = pointerVec.data();

您的代码的主要问题是您使用的是 c_str返回 const char * .请注意,我使用的是 data()成员函数,它返回非常量指针。你的尝试和我的建议之间的另一个区别是你使用的是一个长度不是常量表达式的数组。这在标准 C++ 中是非法的。我改用了一个 vector ,后来将其转换为具有相同 data() 的指针。功能。

关于C++:vector<string> 到 char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34664491/

相关文章:

c++ - 优化代码 : is++p faster than p++?

c++ - 指针类变量从 muncion 返回 NULL

c++ - 2个 vector 的和值

c++:应用于 vector 的STL算法也适用于其他容器对象?

c++ - 试图从 Derived* 的 vector 中分配 Base* 的 vector

c++ - 创建许多头文件,只是#include 许多文件(就像一个集线器文件)

c++ - 最大化小部件时如何在没有其他 QPushButton 的情况下扩展特定 QPushButton 的大小

c++ - 在标题中声明时未在范围内声明变量

c++ - 返回 vector<auto_ptr<T>> 是否安全?

language-agnostic - 在对数时间内找到向量之间的最小角度