繁体   English   中英

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

[英]How to elegantly initialize vector<char *> with string literal?

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

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

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

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

vector<char *> vec = {"Hello", "World"};
vec[0][0] = 'h';

但编译代码我收到警告:

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

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

Segmentation fault (core dumped)

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

char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};
vec[0][0] = 'h';

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

这是一种方式:

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");

请记住:

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

虽然从问题的措辞来看,语法上它是同样的工作,如果它是一个vector<const char*>就好像它是一个vector<char*>无论如何(当你复制时你没有修改源代码,所以如果你可以修改源代码并不重要,所以我会像你刚才那样坚持练习:

std::vector<const char*> v{"Hello", "World!"};

我认为char vs const char差异在这个任务中并不重要。

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

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

查看一个工作示例

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

char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};

补充 :main, argcargv的参数是一个很好的例子

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

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

你可能会尝试这样的事情:

// utility function to create char*'s
template<std::size_t Size>
char* make_rptr(const char (&s)[Size])
{
    char* rptr = new char[Size];
    std::strcpy(rptr, s);
    return rptr;
}

int main()
{
    // initialize vector
    std::vector<char*> v {make_rptr("hello"), make_rptr("world")};

    // use vector
    for(auto&& s: v)
        std::cout << s << '\n';

    // ...

    // remember to dealloacte
    for(auto&& s: v)
        delete[] s;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM