C ++当类型T需要构造函数时,是否可以创建类型为T的std :: list?

时间:2014-01-12 20:47:37

标签: c++ stl std stdlist

例如:

class apple
{
public:
    string name;

    apple::apple(string name) : name(name)
    {
    }
};

如果我想制作一堆每个都有苹果类型的列表,我想我可以做std::list<apple> empire("empire"), macintosh("macintosh")之类的事情。基本上我想在创建列表时为list<T>声明的类T的构造函数传递参数。对不起,如果我没有解释这个问题,如果你有这种能力,请随时编辑我的问题。

由于

编辑这个问题似乎令人困惑,这可能是因为我给出了一个糟糕的例子。我需要重新设计我的课程。按照这个例子,虽然我想要的是一个列表,所有帝国苹果,该列表中的每个苹果都有一个指定类型的帝国,以及一个列表,所有macintosh苹果和每个苹果在该列表中有一个指定类型的macintosh。

所以在这里澄清一些或混淆一些我们去。

class apple
{
public:
    string variety_name;
    string description;
    apple::apple(string variety_name, string description)
        : variety_name(variety_name), description(description)
    {
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    // Vlad from Moscow's answer
    std::list<apple> empire(1, apple("empire", "picked yesterday")),
        macintosh(1, apple( "macintosh", "picked yesterday")); 

    // Vaughn Cato's answer
    empire.push_back(apple("empire", "picked today"));
    macintosh.push_back(apple("macintosh", "picked today"));

    for(list<apple>::iterator it=empire.begin(); it != empire.end(); ++it)
    {
        cout << it->variety_name << " " << it->description << endl;
    }

    for(list<apple>::iterator it=macintosh.begin(); it != macintosh.end(); ++it)
    {
        cout << it->variety_name << " " << it->description << endl;
    }

    return 0;
}

因此,您可以看到存储品种一次而不是每次都更容易;我的班级显然需要重新设计,但这并不能使答案变得不那么有效。每个人都感谢您的帮助

4 个答案:

答案 0 :(得分:6)

当然,您可以使用emplace()emplace_front()emplace_back()使用适当的构造函数就地构造对象:

std::list<apple> list;
list.emplace(list.end(), "one");
list.emplace_front("two");
list.emplace_back("three");

答案 1 :(得分:4)

你可以做到

std::list<apple> a;
a.push_back(apple("delicious"));

答案 2 :(得分:2)

在C ++ 11中,您可以使用初始化列表:

#include <list>
#include <string>

int main() {
    // C++11 initializer-list
    std::list<std::string> species = { "empire", "macintosh" };


    // Without C++11: You may initialize with an array:
    const char* species_array[] = { "empire", "macintosh" };
    std::list<std::string> species_list(
        species_array,
        species_array + sizeof(species_array)/sizeof(species_array[0]));
    return 0;
}

苹果是:

int main() {
    // C++11 initializer-list
    std::list<apple> species = { apple("empire"), apple("macintosh") };


    // Without C++11: Initialize with an array:
    const apple species_arry[] = { apple("empire"), apple("macintosh") };
    std::list<apple> species_list(
        species_arry,
        species_arry + sizeof(species_arry)/sizeof(species_arry[0]));
    return 0;
}

答案 3 :(得分:0)

apple(string name);

是一个所谓的转换构造函数。它将std :: string类型的对象转换为apple类型的对象。编译器在等待aoole类型的对象但是获取std :: string类型的对象时可以隐式调用它。

如果您将构造函数声明为显式,则无法执行此操作。例如

explicit apple(string name);

在这种情况下,您需要明确指定构造函数。例如

std::list<apple> empire( 1, apple( "empire" ) );