如何在C ++中将vector <string>转换为const char * const *?

时间:2018-09-05 11:04:25

标签: c++ data-conversion

我正在尝试将数据转换为用于特定单元测试的正确格式。 任务是挖掘一组单词,单元测试将确保结果正确。我无法访问单元测试,只能访问带有const char * const * Result的声明。

所以我需要得到我的

std::vector<string> Words; 

const char* const* Result;

除以非字母字符(例如空格)。

我知道这是一个指向常量字符的常量指针,所以我不确定在此做什么,因为它们都常量?

任何指针(双关语并非真正意图)都值得赞赏!

3 个答案:

答案 0 :(得分:6)

似乎很容易

#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本身。因此,这只是我们通过将Words投影到std::string::c_str成员上而获得的另一个向量。

之后,Result可以简单地称为result_owner.data();的另一个引用。

这当然假设Result不必拥有它所指向的缓冲区。最好避免拥有原始指针。

答案 1 :(得分:6)

您无法有意义地将一个转换为另一个。但是,您可以将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对象中,并且新矢量内的那些指针仅在原始矢量中的字符串存在,未调整大小且原始矢量时才有效。本身不会调整大小。

指向新向量的第一个元素的指针仅在该向量存在且未调整大小的情况下才有效。

答案 2 :(得分:4)

和穴居人的方式:)

#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]);
    }
}