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)
这次没关系.但这似乎有点单调乏味.有没有其他优雅的方法来初始化字符串文字的向量?
这是一种方法:
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)
我认为char
vsconst 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*指针列表
归档时间: |
|
查看次数: |
11605 次 |
最近记录: |