我有:
vector<string> myVector = {0};
myVector.push_back("first");
myVector.push_back("second");
char *list[] = ????
我希望像我这样做时那样对其进行初始化
char *list[] = { "first", "second", NULL };
我知道我可以根据向量的大小和向量以及向量(list[v.size()+1][longest_string_in_vector]
)中最长字符串的大小开始分配内存,但是我想知道我没有想到可能会更容易/更快速地进行分配。
如果旧代码要求使用char **
,则要创建变量列表,可以像最初在问题中所做的那样创建向量。
之后,创建一个std::vector<char *>
,其中指针是矢量中每个项目的指针。当然,您必须确保向量不会超出范围或调整大小。在创建之前,必须完全“设置”它std::vector<char *>
。
另外,由于您可以确定Legacy函数不会尝试更改发送给它的字符串,因此我们应该删除字符串的“常数”。
#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]);
}
基本上,我们在向量中创建了字符串,并创建了另一个存储指向字符串的指针的向量。
请注意,该函数legacy_function
带有一个char **
,而我们要做的就是将其传递给指针向量中第一个元素的地址。
实时示例: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());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句