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

时间:2012-09-05 22:06:02

标签: c++ vector iterator partial-classes

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

vector<string>* vec = new vector<string>(){"Value1","Value2"};

vector<string>* vec = new vector<string>({"Value1","Value2"});

vector<string> vec = {"Value1","Value2"};

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

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

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

我知道在C#中,您可以使用partial这样的关键字添加您想要的任何内容,

public partial class ClassName
{
   ClassName(Stuff stuff)
   {

   }
   void AmazingNewMethod()
   {

   }    
}

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

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

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

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

感谢。

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

2 个答案:

答案 0 :(得分:7)

在C ++ 11中,initializer lists可以采用这种方法。正如你提到.NET我现在假设你正在使用MS Visual Studio。 Microsoft NOT 实现初始化列表,因此完成此类操作的最简单方法是返回添加了所有元素的向量的函数。

partial上:C ++没有提供与.NET的部分类相同的功能。

答案 1 :(得分: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; }
};

以上显然只关注如何使用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);
};

但是,如果不更改其类型,则无法扩展现有内容。为了避免重新实现大多数成员,你可以公开地继承你想要扩展的类型并添加所有必需的构造函数(这些都不是继承的;在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);
相关问题