繁体   English   中英

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

[英]How to add an Initializer List constructor to STL vector

所以我想要做的是扩展程序中现有的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设置它并将其添加到某个工具箱类中?

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

谢谢。

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

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

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM