如何优雅地初始化向量<;字符*>;用字符串文字? 问题来自于C++第五版的练习:

如何优雅地初始化向量<;字符*>;用字符串文字? 问题来自于C++第五版的练习:,c++,vector,initialization,cstring,stdstring,C++,Vector,Initialization,Cstring,Stdstring,编写一个程序来分配char*指针列表中的元素 将C样式字符串转换为字符串向量 ----------------原始问题------------ 首先,我尝试以下有点直接的方法: vector<char *> vec = {"Hello", "World"}; vec[0][0] = 'h'; 我想这是因为我试图写一个常量字符。所以我尝试另一种方法: char s1[] = "Hello", s2[] = "World"; vector<char *> vec = {s1

编写一个程序来分配char*指针列表中的元素 将C样式字符串转换为字符串向量

----------------原始问题------------

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

vector<char *> vec = {"Hello", "World"};
vec[0][0] = 'h';
我想这是因为我试图写一个常量字符。所以我尝试另一种方法:

char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};
vec[0][0] = 'h';
chars1[]=“你好”,s2[]=“世界”;
向量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 append_literal(std::vector&v,const char(&str)[N]){
char*p=新字符[N];
memcpy(p,str,N);
v、 推回(p);
}
std::向量v;
附加文字(v,“你好”);
附加文字(v,“世界”);
记住:

void clear(std::vector<char*>& v) {
    for (auto p : v) delete[] p;
}
void clear(标准::向量&v){
对于(自动p:v)删除[]p;
}
虽然从问题的措词来看,无论从语法上看,如果它是
向量
还是
向量
都是一样的工作(你在复制时没有修改源代码,所以不管你是否可以修改源代码),所以我会坚持练习,就好像你刚刚做了一样:

std::vector<const char*> v{"Hello", "World!"};
std::vector v{“你好”,“世界!”;

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

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

vector<const char*> vc = {"hello","world"};
vector<string> vs(vc.begin(), vc.end());
向量vc={“你好”,“世界”}; 向量vs(vc.begin(),vc.end()); 见a

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

char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};
chars1[]=“你好”,s2[]=“世界”;
向量vec={s1,s2};

副刊:main、
argc
argv
的参数是

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


请参阅。

您可以尝试以下方法:

// 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;
}
//创建字符*的实用函数
模板
字符*制表符(常量字符(&s)[大小])
{
char*rptr=新字符[大小];
标准:strcpy(rptr,s);
返回rptr;
}
int main()
{
//初始化向量
向量v{make_rptr(“你好”),make_rptr(“世界”)};
//使用向量
用于(自动和s:v)

std::难道不能更改字符串文字的内容。请使用
std::vector
std::string
可以从字符串文字构造)字符串文字是n> const char < /C> >代码>,你可以找到更多的细节。C转换是可以的,但是C++中不允许,这是因为试图修改它们是不确定的行为。@ BordCaldand我知道使用向量更好,但是C++上的练习要求我把向量转换成向量。不知道如何初始化它。@ShafikYaghmour谢谢。我已经阅读了那个链接,但我只想知道初始化向量的正确方法。同样从我所看到的
{“foo”,“bar”}
将首先由编译器转换为
std::strings
列表。然后您尝试将
std::string
分配给
char*
,但失败了。哦,这比我预期的要繁琐得多。但是发人深省。谢谢。为什么在源数组中可编辑?任务描述中似乎没有明确说明这一点Ripe,我猜它的重点是在C++的新世界中传递C字符串。我认为它的用法可能更一般。也许我需要关注你所说的转移。@ WiBabi I找到了一个免费的char指针列表:
char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};
// 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;
}