代码之家  ›  专栏  ›  技术社区  ›  Dan

如何将Initializer List构造函数添加到STL向量

  •  3
  • Dan  · 技术社区  · 12 年前

    所以我想做的是扩展程序中现有的向量类,允许我这样说,

    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函数调用中,该调用通过引用设置这些行,并将其添加到某个工具箱类中?

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

    谢谢

    编辑:修复了提到这是一个Initializer List构造函数的标题。

    2 回复  |  直到 12 年前
        1
  •  7
  •   Pete Becker    12 年前

    在C++11中 initializer lists 以适应这种方法。正如您提到的.NET一样,我现在假设您使用的是MS Visual Studio。微软做到了 不是 实现初始化器列表,因此,实现类似操作的最简单方法是使用一个函数返回添加了所有元素的向量。

    关于 partial 事情:C++并没有提供与.NET的分部类相同的特性。

        2
  •  5
  •   Saurav Sahu    7 年前

    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::矢量<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);
    
    推荐文章