Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化std::string的std::vector_C++_Stdvector_Stdstring - Fatal编程技术网

C++ 初始化std::string的std::vector

C++ 初始化std::string的std::vector,c++,stdvector,stdstring,C++,Stdvector,Stdstring,在使用一些遗留代码的项目中工作时,我发现了以下功能: std::vector<std::string> Object::getTypes(){ static std::string types [] = {"type1","type2", "type3"}; return std::vector<std::string> (types , types +2); } std::vector Object::getTypes(){ 静态std::字符串类型[

在使用一些遗留代码的项目中工作时,我发现了以下功能:

std::vector<std::string> Object::getTypes(){
    static std::string types [] = {"type1","type2", "type3"};
    return std::vector<std::string> (types , types +2);
}
std::vector Object::getTypes(){
静态std::字符串类型[]={“type1”、“type2”、“type3”};
返回std::vector(类型,类型+2);
}
我可能会这样写:

std::vector<std::string> Object::getTypes(){
    std::vector<std::string> types;
    types.push_back("type1");
    types.push_back("type2");
    types.push_back("type3");
    return types;
}
std::vector Object::getTypes(){
std::载体类型;
类型。推回(“类型1”);
类型。推回(“类型2”);
类型。推回(“类型3”);
返回类型;
}
这仅仅是一种风格选择,还是我遗漏了什么?任何帮助都将不胜感激。抱歉,如果这太基本了

更新: 实际上,我们发现不同的类重写了同一个方法,所以它更不明确。我会让他们都一样,但更喜欢更好的方法,如果有一个


编辑

请注意,上面的遗留代码是不正确的,因为它只使用数组的前两个元素初始化向量。然而,该错误已在评论中讨论过,因此应予以保留

正确的初始化应如下所示:

...
    return std::vector<std::string> (types, types + 3);
...
。。。
返回std::vector(类型,类型+3);
...

您找到的代码效率更高(因为
类型[]
只分配一次,而
推回会导致重新分配)。虽然差别不大,但除非在(相对较大的)循环中调用
getTypes
,否则这一点都不重要(即使在大循环中调用它,可能也没什么关系)


因此,除非它产生具体的性能问题,否则这是一种风格选择。

如果您有一个支持C++11的编译器和库,返回初始值设定项列表就足够了:

std::vector<std::string> Object::getTypes(){
    return {"type1","type2", "type3"};
}
std::vector Object::getTypes(){
返回{“type1”、“type2”、“type3”};
}

基本上这是一种风格选择。我可能会做一些更像

std::vector<std::string> Object::getTypes(){
    static std::string types [] = {"type1","type2", "type3"};
    return std::vector<std::string> (types, 
                   types + (sizeof(types)/sizeof(std::string)) );
}
std::vector Object::getTypes(){
静态std::字符串类型[]={“type1”、“type2”、“type3”};
返回标准::向量(类型,
types+(sizeof(types)/sizeof(std::string));
}

它允许您更改类型中的事物数量,而无需记住更新下一行中的计数。

第一个示例中的数组
类型
被声明为静态。这意味着它在内存中只存在一次。所以有三种选择返回什么,它们都存在于静态内存中。然后,当您创建要返回的向量时,您可以通过将数组的开头和结尾作为迭代器传递来一次性分配它的内存

通过这种方式,您不必连续调用
push_back
,这意味着向量不必重新分配其内部内存块


此外,当向量作为返回调用的一部分构造时,较旧的编译器将更容易执行。

我喜欢在迭代器(以及C++11的统一初始化和初始值设定项列表)中使用这种初始化方式的一个原因是它有助于将数据与代码分离


重复很多次“推回”
感觉很糟糕,因为我迫切需要重构它。另外,当您确实需要用数据初始化容器时,您希望看到的是数据列表,而不是生成数据的代码。您在原始版本中找到的方法更符合该原则。

第一个咒语原则上可能更有效,因为它不涉及任何内存重新分配。函数调用也较少。注意在C++11中可以说
returnstd::vector{“type1”、“type2”、“type3”}
@juanchopanza同样,在该版本中,代码和数据的隔离更加明显,因此在语法上更加清晰。第一个版本更容易出错,这里的off by one错误说明了这一点。@MikeSeymour如果使用
std::begin
std::end
(当然,您应该这样做)。如果我尝试这样做,“没有匹配的构造函数来初始化'std::vector',则会出现错误。起初我认为我应该像你说的那样做,但它没有编译。@AndresBucci你需要
std::vector(类型,类型+sizeof(类型)/sizeof(std::字符串))
@AndresBucci-参见编辑,juanchopanza的评论比我的编辑稍微好一点。基本上,vector没有(Type*,NeElements)构造函数,它有(iterator,iterator)构造函数。我想选择你的答案作为可接受的答案,但由于我选择的答案包含解释,我认为这对未来的读者会更好。使用
std::being(types),std::end(types)有什么错
作为向量构造函数的参数?(如果您没有C++11,当然,您可以使用工具箱中相应的函数。)RVO同样适用于所有代码。即使使用“较旧”的编译器(其中许多编译器实际上比一些较新的编译器做得更好)。