【问题标题】:Use structure binding when iterator a vector of std::pair<string, some_struct >*迭代 std::pair<string, some_struct >* 的向量时使用结构绑定
【发布时间】:2020-11-27 10:25:48
【问题描述】:

以下代码显示了结构绑定的正常工作方式。 与“first”、“second”相比,它提供了一个更具描述性的名称。

map<string, string> sites;
sites.insert({ "GeeksforGeeks", "Coding Resources" });

for (auto& [key, value] : sites)
{
   cout << key.c_str() << " " << value.c_str() << endl;
}

现在我有一个std::vector&lt;pair&lt;std::string, People&gt;* &gt; vec; People 这里是一个班级,string 是他/她的昵称。

下面的代码不起作用,因为vec 包含指针。

for (auto & [kay, value] : vec) {}

那我应该怎么做才能使用结构绑定来提供更具描述性的名称呢?


编辑

我使用指针是因为我想避免复制。 这就是我构建std::vector&lt;pair&lt;std::string, People&gt;* &gt; vec; 的方式。

我有一个unordered_map&lt;string, People&gt;,我需要以确定的方式将结果打印给客户端,但地图的遍历顺序是随机的。 所以,我创建了vec 并按字符串对vec 进行排序,这是键。

如果不使用指针,如果我想排序就会发生很多副本。

【问题讨论】:

  • 您必须遍历指针并将结构化绑定推迟到循环内,结构化绑定中没有解除引用的语法,也没有基于范围的 for 循环
  • 我使用指针是因为我想避免复制。
  • 你的意思是你没有做什么deep copy std::pair&lt;std::string, People&gt;,而只是一个vec持有的指针的副本。听起来不太好。无论如何,这是另一个问题/问题。
  • 我更新了问题。它提供了更多信息。 :)
  • 如果答案帮助您解决了问题,您可以将其标记为已接受。否则请告诉我,缺少什么...

标签: c++ c++17 stdvector stdmap structured-bindings


【解决方案1】:

您可以对std::vector&lt;pair&lt;std::string, People&gt;* &gt; vec;进行以下操作

for (std::pair<std::string, People>* pairPtr : vec) // iterate via pair-ptrs
{
   if (pairPtr) // if the pointer is valid!
   {
      const auto& [key, people] = *pairPtr;
      // do something with the key and vale!
   }
}

如果pair-pointer指向数组,则需要遍历并执行上述操作。

顺便说一句,看看 C++17 中的 smart pointers 相当原始的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2021-11-24
    相关资源
    最近更新 更多