如何将auto与push_back与初始化列表一起使用?

时间:2016-01-26 23:23:12

标签: c++ auto

通过初始化列表我的意思是{“something”,“like”,“this”}。我在网上看了,找不到任何这方面的例子。

DoublyLinkedList( std::initializer_list<T> & list)
{
    for (auto T& f : list)
        push_back(f);
}

2 个答案:

答案 0 :(得分:3)

你可能意味着:

for (auto& f : list)

也代替std::initializer_list<T> &(通过引用传递)使用std::initializer_list<T>(按值传递),这样您就可以使用构造函数,如下所示:

DoublyLinkedList({1,2,3});

这是因为复制initializer_list不会复制底层元素数组。

答案 1 :(得分:2)

据我了解,您希望使用std::initializer_list内传递的值初始化某个容器。在这种情况下,您只是在不修改它的情况下阅读list - 所以当它传递给函数/方法(..( std::initializer_list<T> list))时不需要复制,也不需要传递它参考(..( std::initializer_list<T>& list))。而是通过常量引用(..( std::initializer_list<T> const& list))传递它,避免不必要的复制并防止其修改。

然后,当你在基于范围的for循环中遍历列表时,再次只需要读取元素。因此,您可以避免额外的副本(&),也可以防止修改元素(const)。顺便说一句,由于函数/方法声明中的参数修饰符,编译器会阻止对元素的修改。

auto是类型说明符,表示将从其初始值设定项中自动推导出实际类型。您只需使用T代替。

下面是推送到局部向量并返回推送元素数的简单示例。

template<typename T>
size_t DoublyLinkedList( std::initializer_list<T> const& list)
{
    std::vector<T> vec;
    for (auto const& element : list)
        vec.push_back(element);

    // if all you need is to initialize std container with the list:
    // std::vector<T> vec(list);

    return vec.size();
}

int main() {
    cout << "# int elements pushed: " << DoublyLinkedList({1,2,3}) << endl;
    cout << "# string elements pushed: " << DoublyLinkedList({"something", "like", "this"}) << endl;
    return 0;
}

stdout:

推送#elements:3

推送#string元素:3