[英]How to convert a vector<string> to null terminated char **?
我正在尝试将std::vector<std::string>
转换为C样式字符串( char *
)的NULL终止数组。 是否可以不使用new
/ malloc
复制?
基本上,我想将vec转换为没有new / malloc的arr完全一样的东西。
#include <string>
#include <vector>
#include <stdio.h>
using namespace std;
void print(const char **strs)
{
const char **ptr = strs;
while(*ptr) {
printf("%s ", *ptr);
++ptr;
}
}
void print(std::vector<std::string> &strs) {
for(auto iter = strs.begin(); iter != strs.end(); ++iter) {
printf("%s ", iter->c_str());
}
}
void main()
{
const char *arr[] = { "a", "b", "c", "d", "e", "f", NULL };
vector<string> vec;
const char **str = arr;
while(*str) {
vec.push_back(*str);
++str;
}
vec.push_back((char *) NULL); //Doesn't work
//print(vec);
print((const char **) &vec[0]);
}
仅仅通过设置指向该向量开头的指针是不可能的,因为vector<string>
不是您期望的连续字符。
addr1 addr2 addr3
^ ^ ^
| | |
+--------+--------+--------+----
| | | | | | |
| std:: | std:: | std:: |
+----> | string | string | string | ...
| | | | |
| +--------+--------+--------+----
|
|
|
vector<string>
addr1
, addr2
和addr3
是内存中的随机地址。
因此,解决方案是遍历项目,读取字符串和字符,然后将它们放入您的continue数组中。
您需要自己构建指针数组,并且如果在编译时不知道大小,则需要动态分配。 (在此示例中,您可以从sizeof arr
推断出它;但是我假设当您需要重建它时arr
不可用)。
您可以使用指向由向量管理的字符串的指针,因此不需要为它们分配任何内存。
这样就可以得到所需的数组:
std::vector<char const *> vec2;
vec2.reserve(vec.size()+1); // optional, but might improve efficiency
for (auto const & str : vec) {
vec2.push_back(str.c_str());
}
vec2.push_back(nullptr);
print(vec.data());
是否可以不使用new / malloc复制?
如果您的C ++编译器支持将可变长度数组作为扩展,则可以。 否则,您将不得不使用动态内存分配。
std::vector<std::string> vec;
// initialize `vec', etc.
const char *c_strings[vec.size()];
size_t idx = 0;
for (std::vector<std::string>::iterator it = vec.begin(); it != vec.end(); it++) {
c_strings[idx++] = it->c_str();
}
好的,因此您不能在std::vector<std::string>
内存储“ NULL”,我认为这是您要实现的目标。
std::vector
的全部要点在于,它跟踪std::vector::size()
的条目数
但是,如果您确实需要某种可以传递给打印等功能的功能,则可以执行以下操作:
vector<const char *> v;
for(auto iter = vec.begin(); iter != vec.end(); ++iter) {
v.push_back(iter->c_str());
}
v.push_back(NULL);
print(&v[0]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.