如何将初始化列表构造函数添加到STL向量

Dan*_*Dan 3 c++ iterator vector partial-classes

所以我想要做的是扩展程序中现有的vector类,让我这样说,

vector<string>* vec = new vector<string>(){"Value1","Value2"};
Run Code Online (Sandbox Code Playgroud)

要么

vector<string>* vec = new vector<string>({"Value1","Value2"});
Run Code Online (Sandbox Code Playgroud)

要么

vector<string> vec = {"Value1","Value2"};
Run Code Online (Sandbox Code Playgroud)

我知道我可以做到这样的事情,但这样做,

string temp[] = {"Value1","Value2"};
vector<string> vec(temp, temp+ sizeof(temp) /  sizeof( temp[0] ) ); 
Run Code Online (Sandbox Code Playgroud)

这使用向量迭代器构造函数但不能删除额外的行吗?

我知道在C#中你可以使用这样的partial关键词添加你想要的任何东西,

public partial class ClassName
{
   ClassName(Stuff stuff)
   {

   }
   void AmazingNewMethod()
   {

   }    
}
Run Code Online (Sandbox Code Playgroud)

C++在某个地方有一个漂亮的技巧吗?

我是否必须继承vector并构建一个customVector具有构造函数的构造函数,它在后面执行迭代器构造函数的事情?

也许将这些行包装在一个静态Helper函数调用中,该调用通过Reference设置它并将其添加到某个工具箱类中?

我觉得很多程序员都遇到过这个问题.那里有优雅的解决方案吗?

谢谢.

编辑:修复标题,提到这是一个初始化列表构造函数.

MFH*_*MFH 7

在C++ 11中,将采用initializer lists这种方法.正如你提到.NET我现在假设你正在使用MS Visual Studio.微软不会执行初始化列表,因此有所建树最简单的方法一样,将返回所有添加的元素的向量函数.

partial事:C++不提供在同样的.NET的部分类功能.


Die*_*ühl 5

C++ 2011方法是接受std::initializer_list<T>一个构造函数参数:

#include <initializer_list>

template <typename T>
class foo {
    T *d_array;
public:
    foo(std::initializer_list<T> list)
        : d_array(new T[list.size()]) {
        std::copy(list.begin(), list.end(), this->d_array);
    }
    foo(foo const&);
    foo& operator= (foo const&);
    ~foo() { delete[] this->d_array; }
};
Run Code Online (Sandbox Code Playgroud)

以上显然只关注如何使用std::initializer_list<T>.要在内部实际进行分配,您需要分配原始内存并就地构造对象.然而,这不是问题所在.

关于将此支持添加到std::vector<T>:您不必!在C++ 2011中std::vector<T>可以用一个初始化std::initializer_list<T>.在C++ 2003中,你无法做到这一点.您可以做的最好的事情是使用构造函数来支持数组构造,如下所示:

template <typename T>
    template <typename S, int Size>
foo<T>::foo(S const (&array)[Size])
    d_array(new T[Size]) {
    std::copy(array, array + Size, d_array);
};
Run Code Online (Sandbox Code Playgroud)

但是,如果不更改其类型,则无法扩展现有内容.为了避免重新实现大多数成员,你可以公开地继承你想要扩展的类型并添加所有必需的构造函数(这些都不是继承的;在C++ 2011中你可以继承现有的构造函数,但是,使用C++ 2011你不需要无论如何都要这样做).

您可能希望与C++ 2003一起使用的另一种方法是创建一个采用内置数组的因子函数,即:

template <typename T, typename S, int Size>
std::vector<T>
make_vector(S const (&array)[Size]) {
    return std::vector<T>(array, array + Size);
}

char const* init[] = { "Hello", "World" };
std::vector<std::string> value = make_vector<std::string>(init);
Run Code Online (Sandbox Code Playgroud)