我可以使用花括号构建链表吗?

5

我对面向对象的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中找到一个像这样回答的问题,但它们都包括模板,而我还没有学习。如果我可以使我的构造函数实现这个功能,是否可以不使用模板来完成?


1
我认为在C++11中这是可能的。 - paddy
请查看http://www.cplusplus.com/reference/initializer_list/initializer_list/。 - payo
@payo 那将是一个 模板 - WhozCraig
"{1,2,3,4,5,6}" 是一个数组,因此如果您创建一个接受数组并创建列表的构造函数,那么它应该可以工作。 - Jerry Jeremiah
1
@JerryJeremiah 不是数组,那是一个初始化列表。 - Richard J. Ross III
显示剩余3条评论
3个回答

2

是的,您可以通过使用C++11来实现这一点。

您需要定义一个接受std :: initializer_list<int>的构造函数。 (是的,这是一个模板,但是我将向您展示如何使用它。:-))

一个可能的std :: intitializer_list<int>构造函数的实现可能如下:

//in class List:
List (std::initializer_list<int> init) {
    for (auto v : init)
        this->emplace_back(v);
}

在这个练习中,你需要自己实现emplace_backemplace_back应该构造一个新的Node并将其附加到List中。它将是一个有用的成员函数(我保证)。

可能不重要的提示: 如果emplace_back进行堆分配,则此代码可能会泄漏。在这种情况下,请委托给将List放入有效状态的构造函数,以便析构函数可以释放所有堆分配的Nodes。 如果您不理解此内容,则很可能对您的应用程序不太重要。


刚注意到:this->是多余的,但不会有影响。 - Baum mit Augen
很好。对于生产质量的代码,最好提到强异常保证对于这样的构造函数是可取的。也就是说,类似于 std::uninitialized_copy,如果 emplace_back 抛出异常,则必须销毁/删除所有先前构造的对象。 - iavr

0

0

不是真的。我认为在花括号中声明数字列表会让编译器感到困惑。最好声明一个int数组,并将其传递给一个接受int数组和大小变量的构造函数。请考虑以下内容:

int aray[] = {5,6,11,22,11};
int size   = sizeof(aray)/sizeof(int);

MyList(size,aray);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接