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

And*_*cci 9 c++ stdstring stdvector

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

std::vector<std::string> Object::getTypes(){
    static std::string types [] = {"type1","type2", "type3"};
    return std::vector<std::string> (types , types +2);
}
Run Code Online (Sandbox Code Playgroud)

我可能会把它写成:

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;
}
Run Code Online (Sandbox Code Playgroud)

这仅仅是一种风格选择还是我缺少的东西?任何帮助将不胜感激.对不起,如果这太基础了.

更新: 实际上发现覆盖相同方法的不同类可以这样或那样做,所以它更加含糊不清.我会让它们都一样,但如果有的话,我会更喜欢更好的方法.


编辑

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

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

...
    return std::vector<std::string> (types, types + 3);
...
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 9

如果你有一个支持C++ 11的编译器和库,那么返回一个初始化列表就足够了:

std::vector<std::string> Object::getTypes(){
    return {"type1","type2", "type3"};
}
Run Code Online (Sandbox Code Playgroud)


utn*_*tim 5

您找到的代码效率更高(因为types[]只分配一次,push_back可以/将导致重新分配).虽然差别很小,但除非你调用getTypes(相对较大的)循环,否则它根本不重要(即使你在一个大循环中调用它也可能没那么重要).

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


Ant*_*ony 2

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

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

此外,当向量被构造为返回调用的一部分时,较旧的编译器将更容易进行返回值优化