如何在 C++ 中将 vector<string> 转换为 const char* const*?
How do I convert a vector<string> to a const char* const* in c++?
我正在尝试将数据转换为适合特定单元测试的格式。
任务是挖掘一组单词,单元测试将确保结果正确。我无法访问单元测试,只能访问带有 const char* const* 结果的声明。
所以我需要
std::vector<string> Words;
到
const char* const* Result;
除以非字母字符(例如 space)。
我知道这是一个指向常量字符的常量指针,所以我不确定在这里做什么,因为它们都是常量?
感谢任何指点(双关语并非真正有意)!
看起来很简单
#include <algorithm>
#include <functional>
// ...
std::vector<char const*> result_owner(Words.size());
std::transform(begin(Words), end(Words), begin(result_owner),
std::mem_fn(&std::string::c_str));
const char* const* Result = result_owner.data();
仅仅因为 Result
必须提供缓冲区的 const 视图,并不意味着缓冲区必须真正是 const 本身。所以它只是我们通过在 std::string::c_str
成员上投影 Words
获得的另一个向量。
之后 Result
可以简单地成为对 result_owner.data();
的另一个引用。
这当然假设 Result
不必 拥有 它指向的缓冲区。最好避免拥有原始指针。
您无法将一个转化为另一个。但是,您可以将 std::string
的数组转换为指向 char 的指针数组,并且指向此类数组第一个元素的指针将与您想要的结果兼容:
std::vector<const char*> Ptrs;
std::transform(
std::cbegin(Words), std::cend(Words),
std::back_inserter(Ptrs),
[](auto& str) { return str.c_str(); }
);
const char* const* Result = Ptrs.data();
请记住,字符串本身仍存储在 std::string
对象中,新向量中的那些指针仅在原始向量中的字符串存在且未调整大小且原始矢量本身未调整大小。
指向新向量第一个元素的指针仅在该向量存在且未调整大小时才有效。
穴居人的方法:)
#include <iostream>
#include <vector>
#include <string>
#include <string.h>
using namespace std;
char **foo(const vector<string> &vec_of_strings)
{
int num_strings = vec_of_strings.size();
int max_str_len = 0;
for (int i=0;i<num_strings;i++)
{
if (max_str_len < vec_of_strings[i].length()) {
max_str_len = vec_of_strings[i].length();
}
}
// for null termination ...
max_str_len++;
char **result = (char **) malloc(num_strings);
for (int i=0;i<num_strings;i++)
{
result[i] = (char *) malloc(max_str_len);
strcpy(result[i],vec_of_strings[i].c_str());
}
return result;
}
int main(int argc, char **argv)
{
vector<string> vec_of_strings;
vec_of_strings.push_back("Long");
vec_of_strings.push_back("Livvvvvvvve");
vec_of_strings.push_back("The");
vec_of_strings.push_back("King");
const char * const * Result = foo(vec_of_strings);
for (int i=0;i<4;i++)
{
printf("%s\n",Result[i]);
}
}
我正在尝试将数据转换为适合特定单元测试的格式。 任务是挖掘一组单词,单元测试将确保结果正确。我无法访问单元测试,只能访问带有 const char* const* 结果的声明。
所以我需要
std::vector<string> Words;
到
const char* const* Result;
除以非字母字符(例如 space)。
我知道这是一个指向常量字符的常量指针,所以我不确定在这里做什么,因为它们都是常量?
感谢任何指点(双关语并非真正有意)!
看起来很简单
#include <algorithm>
#include <functional>
// ...
std::vector<char const*> result_owner(Words.size());
std::transform(begin(Words), end(Words), begin(result_owner),
std::mem_fn(&std::string::c_str));
const char* const* Result = result_owner.data();
仅仅因为 Result
必须提供缓冲区的 const 视图,并不意味着缓冲区必须真正是 const 本身。所以它只是我们通过在 std::string::c_str
成员上投影 Words
获得的另一个向量。
之后 Result
可以简单地成为对 result_owner.data();
的另一个引用。
这当然假设 Result
不必 拥有 它指向的缓冲区。最好避免拥有原始指针。
您无法将一个转化为另一个。但是,您可以将 std::string
的数组转换为指向 char 的指针数组,并且指向此类数组第一个元素的指针将与您想要的结果兼容:
std::vector<const char*> Ptrs;
std::transform(
std::cbegin(Words), std::cend(Words),
std::back_inserter(Ptrs),
[](auto& str) { return str.c_str(); }
);
const char* const* Result = Ptrs.data();
请记住,字符串本身仍存储在 std::string
对象中,新向量中的那些指针仅在原始向量中的字符串存在且未调整大小且原始矢量本身未调整大小。
指向新向量第一个元素的指针仅在该向量存在且未调整大小时才有效。
穴居人的方法:)
#include <iostream>
#include <vector>
#include <string>
#include <string.h>
using namespace std;
char **foo(const vector<string> &vec_of_strings)
{
int num_strings = vec_of_strings.size();
int max_str_len = 0;
for (int i=0;i<num_strings;i++)
{
if (max_str_len < vec_of_strings[i].length()) {
max_str_len = vec_of_strings[i].length();
}
}
// for null termination ...
max_str_len++;
char **result = (char **) malloc(num_strings);
for (int i=0;i<num_strings;i++)
{
result[i] = (char *) malloc(max_str_len);
strcpy(result[i],vec_of_strings[i].c_str());
}
return result;
}
int main(int argc, char **argv)
{
vector<string> vec_of_strings;
vec_of_strings.push_back("Long");
vec_of_strings.push_back("Livvvvvvvve");
vec_of_strings.push_back("The");
vec_of_strings.push_back("King");
const char * const * Result = foo(vec_of_strings);
for (int i=0;i<4;i++)
{
printf("%s\n",Result[i]);
}
}