std::initializer_list 类模板是在 C++ 11 中添加的,包含许多内置函数,用于使用初始值设定项列表执行各种操作。它提供了诸如 size()、begin()、end() 和构造函数之类的成员函数来构造、迭代和访问初始值设定项列表的元素。
要使用initializer_list,您需要包含<initializer_list>C++ 程序中的标头。
C++ 中的 std::initializer_list
在 C++ 中,std::initializer_list 是一个类模板,它允许我们使用值列表初始化轻量级对象。初始值设定项列表用于以方便的方式为变量、数组、类、函数、类的构造函数以及向量等标准容器设置值。
用法
initializer_list<T> name_of_list= { };
- 支撑初始化r用于构造initializer_list的对象。
- 它通常作为数组的包装器来实现。
- 与向量等标准容器不同,复制初始值设定项列表的对象不会将整个元素复制到复制列表中。但初始值设定项列表的原始对象和复制对象都包含相同的元素。
C++ 中的 std::initializer_list 示例
示例 1:
下面的示例演示了 C++ 中初始化列表的使用。
C++
// C++ program to demonstrate the use of initializer list
#include <initializer_list>
#include <iostream>
using namespace std;
int main()
{
// Initializing an object using initializer_list
initializer_list<int> num = { 2, 4, 6, 8, 10, 12 };
// Accessing elements
cout << "Numbers in the list are: ";
for (int it : num) {
cout << it << " ";
}
return 0;
}
Numbers in the list are: 2 4 6 8 10 12
Note Member initializer list and initializer_list are not the same. Both are different, it should not be confused with each other.
示例 2:
编写程序来说明如何使用 initializer_list 来构造对象。
C++
// C++ program to illustrate the use of initializer_list in
// object construction
#include <iostream>
using namespace std;
#include <initializer_list>
// array type container constructed using initializer list
template <typename T> class MyContainer {
public:
// Constructor taking initializer_list as a parameter
MyContainer(initializer_list<T> values)
: list(values)
{
}
// Function to print all elements
void printList() const
{
for (const T& value : list) {
cout << value << " ";
}
cout << endl;
}
private:
initializer_list<T> list;
};
// diver code
int main()
{
// Creating an instance of MyContainer with
// initializer_list of int type
MyContainer<int> intContainer = { 1, 2, 3, 4, 5 };
cout << "Elements of Integer type are: ";
intContainer.printList();
cout << endl;
// Creating an instance of MyContainer with
// initializer_list of double type
cout << "Elements of double type are: ";
MyContainer<double> doubleContainer
= { 1.1, 2.2, 3.3, 4.4, 5.5 };
doubleContainer.printList();
cout << endl;
return 0;
}
Elements of Integer type are: 1 2 3 4 5 Elements of double type are: 1.1 2.2 3.3 4.4 5.5
std::initializer_list的成员函数
以下是std::initialzer_list类的一些常用成员函数:
S. 编号 |
函数名称 |
说明 |
---|---|---|
1 |
begin() |
返回指向初始值设定项列表的第一个元素的指针。 |
2 |
end() |
返回指向初始值设定项列表的最后一个元素的指针。 |
3 |
size() |
size() 函数返回初始值设定项列表中存在的元素数量。 |
4 |
empty() |
如果初始值设定项列表为空,则此函数返回 true。否则为假。 |
5 |
data() |
返回指向底层数组容器的指针。 |
initializer_list的应用
除了构造对象之外,初始化列表还可用于以下情况:
1. 可变函数参数
<initializer_list> 用于将可变数量的参数传递给函数。
示例
下面的示例演示了将初始值设定项列表传递给函数。
C++
// C++ program to demonstrate the passing of initializer
// list to a function.
#include <iostream>
using namespace std;
#include <initializer_list>
void myFunction(initializer_list<int> myList)
{
// Print the size (length) of myList
cout << "Size of myList: " << myList.size();
cout << "\n";
// Print elements of myList
cout << "Elements of myList: ";
// iterate to all the values of myList
for (int value : myList) {
// Print value at each iteration
cout << value << " ";
}
}
int main()
{
// Using initializer list when calling a function
myFunction({ 1, 2, 3, 4, 5 });
return 0;
}
Size of myList: 5 Elements of myList: 1 2 3 4 5
2. 将数据存储在连续内存中
initializer_list 容器的元素可用于存储数据,因为它是一个轻量级容器。
示例
下面的示例演示了如何使用基于范围的循环来访问 initializer_list 的元素。
C++
// C++ program to demonstrate the use of range based loops to access elements of initializer_list.
#include <iostream>
using namespace std;
#include <initializer_list>
int main() {
initializer_list<int> list = {1, 2, 3, 4, 5};
// Using range-based for loop
for (int value : list) {
cout << value << " ";
}
cout << endl;
return 0;
}
1 2 3 4 5
3. 初始化标准容器
initializer_list 可用于使用元素列表初始化标准容器 就像向量一样。
示例
下面的示例演示了如何使用initializer_list来初始化标准容器。
C++
// C++ program to demonstrate the use of initializer_list to
// initialize standard containers.
#include <iostream>
#include <vector>
using namespace std;
#include <initializer_list>
void printVector(initializer_list<int> list)
{
// initialize vector using initializer_list
vector<int> myVector(list);
// Printing the elements of vector
for (int value : myVector) {
cout << value << " ";
}
cout << endl;
}
int main()
{
// pass initializer_list to function
printVector({ 1, 2, 3, 4, 5 });
return 0;
}
1 2 3 4 5
4. 初始化列表作为返回类型
initializer_list 可以用作从任何函数返回列表的返回类型。它允许函数返回多个值。
示例
下面的示例演示了如何使用 initializer_list 作为返回类型。
C++
// C++ program to demonstratethe use of initializer_list as
// return type.
#include <initializer_list>
#include <iostream>
#include <vector>
using namespace std;
initializer_list<int> getNumbers()
{
return { 1, 2, 3, 4, 5 };
}
int main()
{
auto num = getNumbers();
// Use the generated numbers
for (auto it : num) {
cout << it << " ";
}
return 0;
}
1 2 3 4 5
initializer_list的限制
初始化列表也有一些与之相关的限制:
- 尺寸无法更改:initializer_list的大小在编译时是固定的。它不具有矢量等标准容器的动态特性。初始化程序的大小一旦创建就无法更改。
- 无法随机访问元素:initializer_list仅支持前向迭代。我们无法使用索引作为标准容器来访问所需的或随机的元素。
- 不可变元素:initializer_list 中的元素是不可变的。创建列表后,将无法修改这些值。任何通过迭代器或任何其他方式修改元素的尝试都将导致编译错误。
相关用法
- C++11 std::move_iterator用法及代码示例
- C++17 std::clamp用法及代码示例
- C++17 std::lcm用法及代码示例
- C++17 std::variant用法及代码示例
- C++14 std::integer_sequence用法及代码示例
- C++14 std::quoted用法及代码示例
- C++17 std::cyl_bessel_i用法及代码示例
- C++14 std::make_unique用法及代码示例
- C++ cos()用法及代码示例
- C++ sin()用法及代码示例
- C++ asin()用法及代码示例
- C++ atan()用法及代码示例
- C++ atan2()用法及代码示例
- C++ acos()用法及代码示例
- C++ tan()用法及代码示例
- C++ sinh()用法及代码示例
- C++ ceil()用法及代码示例
- C++ tanh()用法及代码示例
- C++ fmod()用法及代码示例
- C++ acosh()用法及代码示例
- C++ asinh()用法及代码示例
- C++ floor()用法及代码示例
- C++ atanh()用法及代码示例
- C++ log()用法及代码示例
- C++ trunc()用法及代码示例
注:本文由纯净天空筛选整理自manikandansanmugam大神的英文原创作品 std::initializer_list in C++ 11。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。