📜  C++中的结构化绑定

📅  最后修改于: 2021-05-30 10:16:34             🧑  作者: Mango

先决条件: C++中的元组

结构化绑定是C++ 17的最新功能之一,它将指定的名称绑定到初始化程序的子对象或元素。简而言之,结构化绑定使我们能够声明从元组或结构初始化的多个变量。 C++ 17中的结构化绑定的主要目的是使代码简洁易懂。像引用一样,结构化绑定是现有对象别名。与引用不同,结构化绑定的类型不必是引用类型

句法 :

auto ref-operator(optional)[identifier-list] = expression;

// Or

auto ref-operator(optional)[identifier-list]{expression};

// Or

auto ref-operator(optional)[identifier-list](expression);

参数 :

  • 自动:自动
  • 引用运算符: &或&&
  • identifier-list:逗号分隔的变量名列表。
  • expression:该表达式在顶层没有逗号运算符(即,赋值表达式),并且具有数组或非联合类类型。

基本类型推导:

E表示初始值设定项表达式的类型。 E应该是std :: tuple的特殊化,或者是其非静态数据成员都可以访问并在E的同一基类中声明的类型。结构化绑定声明以三种可能的方式之一执行绑定,具体取决于一。

  • 情况1 :如果E是数组类型,则名称绑定到数组元素。
  • 情况2 :如果E是非工会类类型和tuple_size如果是完整类型,则使用“类似元组”的绑定协议。
  • 情况3 :如果E是非工会类类型,但为tuple_size不是完整类型,则名称绑定到E的公共数据成员。

让我们借助示例了解结构绑定相对于元组的优势:
示例1:在C++ 98中

#include 
using namespace std;
  
// Creating a structure named Point
struct Point {
    int x;
    int y;
};
  
// Driver code
int main()
{
    Point p = {1, 2};
      
    int x_coord = p.x;
    int y_coord = p.y;
      
    cout << "X Coordinate : " << x_coord << endl;
    cout << "Y Coordinate : " << y_coord << endl;
  
    return 0;
}

输出 :

X Coordinate : 1
Y Coordinate : 2

示例2:在C++ 11 / C++ 14中

#include 
#include 
using namespace std;
  
// Creating a structure named Point
struct Point
{
    int x, y;
      
    // Default Constructor
    Point() : x(0), y(0) 
    {
          
    }
      
    // Parameterized Constructor for Init List
    Point(int x, int y) : x(x), y(y) 
    {
          
    }
    auto operator()()
    {
        // returns a tuple to make it work with std::tie
        return make_tuple(x, y); 
    }
};
  
// Driver code
int main()
{
    Point p = {1, 2};
    int x_coord, y_coord;
    tie(x_coord, y_coord) = p();
      
    cout << "X Coordinate : " << x_coord << endl;
    cout << "Y Coordinate : " << y_coord << endl;
      
    return 0;
}

输出 :

X Coordinate : 1
Y Coordinate : 2

示例3:在C++ 17中

#include 
using namespace std;
  
struct Point
{
    int x;
    int y;
};
  
// Driver code
int main( )
{
    Point p = { 1,2 };
      
    // Structure binding
    auto[ x_coord, y_coord ] = p;
      
    cout << "X Coordinate : " << x_coord << endl;
    cout << "Y Coordinate : " << y_coord << endl;
      
    return 0;
}

输出 :

X Coordinate : 1
Y Coordinate : 2

应用程序:结构化绑定可以与数组一起使用,以从数组中获取元素。在这种情况下,E是数组类型,因此名称绑定到数组元素。下面是实现相同的实现:

#include 
using namespace std;
  
int main()
{
  
    int arr[3] = { 1, 2, 3 };
      
    // Here, E is an array type, hence the 
    // names are bound to the array elements.
    auto[x, y, z] = arr;
      
    cout << x << " " << y << " " << z << endl;
  
    return 0;
}

输出 :

1 2 3

注意:标识符列表中的标识符数量必须等于数组中元素的数量。如果标识符列表中的标识符数量较少,则可能会发生编译时错误或设计时错误。这意味着我们不能从数组中获取特定的元素集。

使用结构化绑定的一个更实际的示例如下:

#include 
#include 
using namespace std;
  
int main()
{
    // Creating a map with key and value 
    // fields as String
    map sites;
      
    sites.insert({ "GeeksforGeeks", "Coding Resources" });
    sites.insert({ "StackOverflow", "Q-A type" });
    sites.insert({ "Wikipedia", "Resources + References" });
  
    for (auto & [ key, value ] : sites) 
    {
       cout << key.c_str() << " " << value.c_str() << endl;
    }
      
    return 0;
}

输出 :

GeeksforGeeks Coding Resources
StackOverflow Q-A type
Wikipedia Resources + References

注意: const和volatile等限定符可以与type一起使用,以使声明变量为常量或volatile。

有关结构化绑定的更多详细信息,请参见:P0144R0

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”