江苏建设教育协会网站,栾川有做网站的吗,专业做足球体彩网站,北京商场排名前十initializer_list 是 C11 中的一个特性#xff0c;它允许你使用花括号 {} 中的值列表来初始化容器或数组。通常用于初始化标准库容器#xff0c;比如 std::vector、std::set、std::map 以及数组。
场景一#xff1a;用初始化列表初始化容器
std::vectorint arr {…initializer_list 是 C11 中的一个特性它允许你使用花括号 {} 中的值列表来初始化容器或数组。通常用于初始化标准库容器比如 std::vector、std::set、std::map 以及数组。
场景一用初始化列表初始化容器
std::vectorint arr {1, 2, 3, 4, 5};
std::setint myset {1, 2, 3, 4, 5, 2};
std::mapint, char mymap {{1, a}, {2, b}, {3, c}};这种初始化方式使代码更简洁和可读在背后使用了 initializer_list 的机制
场景二直接使用初始化列表
#include iostream
#include initializer_listint main()
{std::initializer_listint numbers {1, 2, 3, 4, 5};for (const int num : numbers) {std::cout num ;}return 0;
}可以像一般的数组一样使用initializer_list但这样没有什么太大的意义如果想节省性能可直接用原始数组如果想要方便操作可以用std::vector, 这里要说明的是
std::initializer_list 相比于std::vector更为轻量级它只存储了一个指向列表内存的指针和一个表示元素数量的整数变量而std::vector还需要维护其插入、迭代、删除等等操作所需要的其他辅助资源。
主要应用场景初始化一个类的容器成员让自定义类可以用初始化列表的形式来实例化对象
考虑一个简单的类MyClass它包含一个vector容器成员。比较两种不同的构造函数一种使用std::initializer_list另一种使用std::vector作为参数
#include iostream
#include vector
#include initializer_listclass MyClass
{
public:// 构造函数使用 std::initializer_listMyClass(std::initializer_listint values) : numbers(values) {}// 构造函数使用 std::vector 作为参数MyClass(const std::vectorint values) : numbers(values) {}
private:std::vectorint numbers;
};int main()
{// 使用 std::initializer_list 初始化 MyClassMyClass obj1 {1, 2, 3, 4, 5};// 使用 std::vector 初始化 MyClassstd::vectorint values {1, 2, 3, 4, 5};MyClass obj2(values);return 0;
}可以看到使用initializer_list的优点
方便。可以用初始化列表初始化我们自定义的类这玩意儿在某些应用场景下是特别方便且代码可读性极高各位慢慢探索。比 std::vector 更轻量和高效。 当你使用 nitializer_lis 作为形参时在值传递过程中只包括一个指向初始化列表元素的指针和一个表示元素数量的整数。 注意一下如果不显示提供initializer_list作为形参的构造函数是不能用初始化列表来初始化实例对象的。比如你以为可以但实际上不可以的这种情况
class MyClass
{
public:// 构造函数使用 std::vector 作为参数MyClass(const std::vectorint values) : numbers(values) {}private:std::vectorint numbers;
};int main()
{MyClass obj1 { 1, 2, 3, 4, 5 };return 0;
}