gpt4 book ai didi

c++ - 从字符串 vector 初始化二维数组的最简单方法是什么?

转载 作者:行者123 更新时间:2023-11-28 06:13:48 25 4
gpt4 key购买 nike

我有:

vector<string> myVector = {0};

myVector.push_back("first");
myVector.push_back("second");

char *list[] = ????

我希望它像我这样做一样被初始化

char *list[] = { "first", "second", NULL };

我知道我可以根据 vector 的大小和 vector 中最长字符串的大小开始分配内存 (list[v.size()+1][longest_string_in_vector])但我想看看我没有想到可能更容易/更快的东西。

最佳答案

如果遗留代码需要 char ** ,然后要创建变量列表,您可以像最初在问题中所做的那样创建一个 vector 。

之后,创建一个 std::vector<char *> ,其中指针是每个项目的 vector 内的指针。当然,您必须确保 vector 不会超出范围或调整大小。在创建 std::vector<char *> 之前必须完全“设置”它.

此外,由于您确定遗留函数不会尝试更改发送给它的字符串,我们应该去掉字符串的“常量”。

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

void legacy_function(char **myList)
{
for (int i = 0; myList[i]; ++i)
std::cout << myList[i] << "\n";
}

using namespace std;
int main()
{
vector<string> myVector;
myVector.push_back("first");
myVector.push_back("second");
//...
// create the pointer vector
vector<char *> myPtrVector;
// add pointer to string to vector
for (size_t i = 0; i < myVector.size(); ++i)
myPtrVector.push_back(const_cast<char*>(myVector[i].c_str()));
// stick the null at the end
myPtrVector.push_back(NULL);
// ...
// call legacy function
legacy_function(&myPtrVector[0]);
}

基本上,我们在一个 vector 中创建了字符串,并创建了另一个 vector 来存储指向字符串的指针。

注意函数legacy_function需要 char ** ,我们需要做的就是将指针 vector 中第一个元素的地址传递给它。

实例:http://ideone.com/77oNns

编辑:与其将代码散布在程序的不同区域,不如在代码组织方面更好的方法是封装数组的创建:

#include <vector>
#include <string>

class CharPtrPtr
{
std::vector<std::string> m_args;
std::vector<char *> m_argsptr;

public:
void add(const std::string& s) { m_args.push_back(s); }

char ** create_argsPtr()
{
m_argsptr.clear();
for (size_t i = 0; i < m_args.size(); ++i)
m_argsptr.push_back(const_cast<char*>(m_args[i].c_str()));
m_argsptr.push_back(NULL);
return &m_argsptr[0];
}

char **get_argsPtr() { return m_argsptr.empty()?NULL:&m_argsptr[0]; }

void clear_args() { m_args.clear(); m_argsptr.clear(); }
};


#include <iostream>

void legacy_function(char **myList)
{
for (int i = 0; myList[i]; ++i)
std::cout << myList[i] << "\n";
}

int main()
{
CharPtrPtr args;
args.add("first");
args.add("second");
legacy_function(args.create_argsPtr());
}

实例:http://coliru.stacked-crooked.com/a/834afa665f054a1f

关于c++ - 从字符串 vector 初始化二维数组的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30713605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com