3

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

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

这使用了向量迭代器构造函数,但我不能删除多余的行吗?

partial我知道在 C# 中,你可以通过使用这样的关键字将任何你想要的东西添加到现有的东西中,

public partial class ClassName
{
   ClassName(Stuff stuff)
   {

   }
   void AmazingNewMethod()
   {

   }    
}

C++ 在某处有这样的绝招吗?

我是否必须继承向量并构建一个customVector具有在幕后执行迭代器构造函数的构造函数?

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

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

谢谢。

编辑:固定标题以提及这是一个 Initializer List 构造函数。

4

2 回答 2

7

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

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

于 2012-09-05T22:10:27.667 回答
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++ 2011std::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);
于 2012-09-05T22:19:47.433 回答