我可以用花括号构造一个链表吗?
Posted
技术标签:
【中文标题】我可以用花括号构造一个链表吗?【英文标题】:Can i construct a linked list with curly braces? 【发布时间】:2014-05-07 06:55:35 【问题描述】:我对面向对象的 C++ 相当陌生,我正在尝试以这种方式为链表创建构造函数:
在 List.h 的某个地方,我们会有这个:
struct Node
int data;
Node *next;
;
然后在 main.cpp 中,我希望能够构建一个这样的列表:
int main()
List A(1,2,3,4,5,6);// I want the amount of numbers to indicate the size of
//the list and the numbers to go into each node in order
return 0;
所以我的问题是,我可以制作这样的构造函数吗?如果是,那怎么办?我必须使用模板吗?我试图在 SO 中找到这样的问题,但它们都包含模板,我还没有学会。如果我可以让我的构造函数做到这一点,是否可以不使用模板来做到这一点?
【问题讨论】:
我认为这在 C++11 中是可能的。 看看cplusplus.com/reference/initializer_list/initializer_list @payo 那将是一个模板。1,2,3,4,5,6
是一个数组,所以如果你创建一个构造函数,它接受一个数组并创建应该工作的列表。
@JerryJeremiah 不,不是。这是一个初始化列表,但绝对不是数组。
【参考方案1】:
是的,您可以这样做(使用 C++11)。
您需要定义一个采用std::initializer_list<int>
的构造函数。
(是的,这是一个模板,但我会告诉你如何使用它。:-))
std::intitializer_list<int>
-constructor 的可能实现如下所示:
//in class List:
List (std::initializer_list<int> init)
for (auto v : init)
this->emplace_back(v);
您必须自己实施emplace_back
作为练习。 emplace_back
应该构造一个新的Node
并将其附加到List
。这将是一个有用的成员函数(我保证)。
可能不重要的通知:
如果emplace_back
进行堆分配,则此代码可能会泄漏。在这种情况下,委托给将List
置于有效状态的构造函数,因此析构函数可以释放所有堆分配的Nodes
。
如果您不理解这一点,它很可能对您的应用程序不太重要。
【讨论】:
刚刚注意到:this->
是多余的,但不会造成伤害。
不错。对于生产质量代码,值得一提的是,这种构造函数需要强大的异常保证。也就是说,与std::uninitialized_copy 类似,如果emplace_back
抛出,则必须销毁/删除所有先前构造的对象。【参考方案2】:
您需要一个接受std::initializer_list
的构造函数。在此处查看示例:http://en.cppreference.com/w/cpp/utility/initializer_list
【讨论】:
【参考方案3】:不是真的。我相信花括号中数字列表的声明会使编译器感到困惑。最好声明一个 int 数组并将其传递给一个构造函数,该构造函数接受一个 int 数组和一个大小变量考虑以下内容:
int aray[] = 5,6,11,22,11;
int size = sizeof(aray)/sizeof(int);
MyList(size,aray);
【讨论】:
以上是关于我可以用花括号构造一个链表吗?的主要内容,如果未能解决你的问题,请参考以下文章