如何将 auto 与初始值设定项列表一起使用push_back

How do I use auto with push_back with an initializerlist?

本文关键字:一起 列表 back push auto      更新时间:2023-10-16

通过初始化程序列表,我的意思是{"某物","喜欢","这个"}。我在网上看了看,找不到任何这样的例子。

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

你可能的意思是:

for (auto& f : list)
此外,使用

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

DoublyLinkedList({1,2,3});

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

据我了解,您想使用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;
}

标准输出:

# 推送元素:3

# 推送的字符串元素:3