从字符串向量初始化2d数组的最简单方法是什么?
What is the easiest way to initialize a 2d array from a vector of strings?
我有:
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 *>
之前必须完全"设置"。
另外,既然你确定遗留函数不会试图改变发送给它的字符串,我们应该去掉字符串的"constness"。
#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容器中创建了string对象,并创建了另一个vector容器来存储指向string对象的指针。注意,函数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());
}
实例:http://coliru.stacked-crooked.com/a/834afa665f054a1f
我试过这两种方法,
1。手动初始化
char *list[] = { (char*)&myVector[0][0], (char*)&myVector[1][0] };
2。在循环中初始化
char **list2 = new char*[ myVector.size() ];
for ( unsigned int i = 0; i < myVector.size(); ++i ) {
list2[ i ] = (char*)&myVector[ i ][0];
}
然而,这些列表只有指向vector中的每个字符串的指针,实际上没有副本。如果您更改字符串,您将看到列表中的更改。但是如果你清空vector,那么列表将有一个悬空指针。
3。如果需要字符串的副本,则
char **list = new char*[ myVector.size() ];
for ( unsigned int i = 0; i < myVector.size(); ++i ) {
list[ i ] = new char[myVector[i].size()+1];
strcpy( list[ i ], &myVector[i][0] );
}
我不会写这段代码,但是,这就是…
相关文章:
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 将时间戳打印到流的最简单方法
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- boost::variant - 对变体应用算术的最简单方法
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 在C++中将算术类型转换为 std::array 的最简单方法<uint8_t>
- C++-将ASCII字符数组中可能的数值转换为字符的最简单方法
- 从 txt 文件中读取数据的最简单方法
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 对于我扩展此程序来计算最高10x10矩阵的倒数的最简单方法是什么
- C++98 中获取并继续调用当前类不知道的类方法的最简单方法是什么?
- 编写要在 Python 中使用的并行 C/C++ 模块的最简单方法
- 开放式颜色多边形表面的最简单方法
- 确定代码中当前程序集是否为 32/64 位的最简单方法
- 将unique_ptr存储在堆上的最简单方法是什么
- 使用 C# 获取 OpenGL 版本的最简单方法
- 在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?
- 为depth_first_search定义颜色图的最简单方法