如何使用字符串文字优雅地初始化vector <char*>?

War*_*ean 8 c++ initialization vector cstring stdstring

问题来自于C++ Primer第5版的练习:

编写一个程序,将char*指针列表中的元素分配给C风格的字符串到一个字符串向量.

---------------- Oringinal Question ------------

首先,我尝试以下有点直接的方式:

vector<char *> vec = {"Hello", "World"};
vec[0][0] = 'h';
Run Code Online (Sandbox Code Playgroud)

但编译代码我收到警告:

temp.cpp:11:43: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     vector<char *> vec = {"Hello", "World"};
                                           ^ 
Run Code Online (Sandbox Code Playgroud)

运行./a.out我得到了一个

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

我想是因为我试着写一个const char.所以我尝试另一种方式:

char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};
vec[0][0] = 'h';
Run Code Online (Sandbox Code Playgroud)

这次没关系.但这似乎有点单调乏味.有没有其他优雅的方法来初始化字符串文字的向量?

Bar*_*rry 6

这是一种方法:

template <size_t N>
void append_literal(std::vector<char*>& v, const char (&str)[N]) {
    char* p = new char[N];
    memcpy(p, str, N);
    v.push_back(p);
}

std::vector<char*> v;
append_literal(v, "Hello");
append_literal(v, "World");
Run Code Online (Sandbox Code Playgroud)

请记住:

void clear(std::vector<char*>& v) {
    for (auto p : v) delete[] p;
}
Run Code Online (Sandbox Code Playgroud)

尽管从问题的措辞来看,从语法上来讲,无论如何vector<const char*>它都是一样的vector<char*>(无论是复制时,您不是在修改源,因此,如果您可以修改源,则没有关系)),因此我会坚持练习,就像您刚刚做的那样:

std::vector<const char*> v{"Hello", "World!"};
Run Code Online (Sandbox Code Playgroud)


Wol*_*olf 6

我认为charvsconst char差异在这项任务中并不重要.

对于实际副本,请使用带有迭代器参数的fill构造函数:

vector<const char*> vc = {"hello","world"};
vector<string> vs(vc.begin(), vc.end());
Run Code Online (Sandbox Code Playgroud)

查看一个工作示例.

如果源代码中需要可编辑的字符,只需使用您发布的第二个版本:

char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};
Run Code Online (Sandbox Code Playgroud)

补充:主要的参数,argc并且argv,是一个很好的例子

C*样式字符串的char*指针列表

了解如何将argc和argv转换为字符串向量.