我可以用花括号构造一个链表吗?

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-&gt; 是多余的,但不会造成伤害。 不错。对于生产质量代码,值得一提的是,这种构造函数需要强大的异常保证。也就是说,与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);

【讨论】:

以上是关于我可以用花括号构造一个链表吗?的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize 普通对象返回空 - 花括号行为不端

Scala方法调用中的花括号[重复]

替换花括号中的逗号

分段函数怎么用mathtype打出大花括号

拷贝构造函数

3.php流程控制