【问题标题】:Going through a constant list of tuples in C++在 C++ 中遍历元组的常量列表
【发布时间】:2019-07-19 21:29:38
【问题描述】:

对不起,愚蠢的问题。我正在尝试在 C++ 中创建并遍历一个恒定的对列表,但到目前为止在 Google 上找不到任何东西。理想情况下,我也会在 for 语句中获得第一个元素和第二个元素。

到目前为止我有:

for (auto& tup : std::tuple<char*, char*> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} }) {

}

在python中它真的很简单,我可以做到(甚至不需要方括号):

for tup in [('', ''), ('abc', 'cba'), ('abcd', 'dcba')]:
    pass

有什么想法吗?

【问题讨论】:

    标签: c++ list stl tuples


    【解决方案1】:

    如果您的代码中不止一处需要元组列表,请单独创建:

    constexpr std::tuple<std::string_view, std::string_view> the_list[] = {
        {"", ""}, {"abc", "cba"}, {"abcd", "dcba"}
    };
    

    那么使用就很简单了:

    for (auto& [one,two] : the_list) {
        std::cout << one << " , " << two << "\n";
    }
    

    如果只在一个循环中使用,你可以直接使用初始化列表:

    for (auto& [one,two] : std::initializer_list<std::tuple<std::string_view, std::string_view>>
        {
            {"", ""}, {"abc", "cba"}, {"abcd", "dcba"}
        }
    ) {
        std::cout << one << " , " << two << "\n";
    }
    

    【讨论】:

      【解决方案2】:

      这应该没那么复杂,只需创建一个元组数组即可。

      并确保他们是const char* 而不是char*

      #include <iostream>
      #include <tuple>
      
      int main() {
      
          std::pair<const char*, const char*> a[] =  { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} };
      
          for (auto& tup : a) {
              std::cout << std::get<0>(tup) << " " << std::get<1>(tup);
          }
      
          return 0;
      }
      

      【讨论】:

        【解决方案3】:

        首先,字符串文字不允许分配给char*,所以无论如何你都应该使用const char*std::string_view 可能会更好。

        使用std::tuple&lt;char*, char*&gt; { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} },您正在尝试构造一个单个 std::tuple&lt;char*, char*&gt;,其中包含std::tuple&lt;char*, char*&gt; 的初始值设定项列表。

        如果你只想遍历std::tuples的列表,你可以手动重复列出类型:

        for (auto&& tup : { std::tuple<const char*, const char*>{"", ""},
                            std::tuple<const char*, const char*>{"abc", "cba"},
                            std::tuple<const char*, const char*>{"abcd", "dcba"} }) {
            /* ... */
        }
        

        基本上,std::initializer_list&lt;std::tuple&lt;char*, char*&gt;&gt; 在哪里创建并通过。如果你觉得这样太难看,你也可以只指定一次类型:

        for (auto&& x : std::initializer_list<std::tuple<const char*, const char*>>
            {
                {"a1", "a2"},
                {"b1", "b2"}
            }
        ) { /* ... */ }
        

        【讨论】:

          【解决方案4】:

          之前只创建一个临时数组:

          std::tuple<const char*, const char*> tmp[]={ {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} };
          
          for (const auto& tup : tmp) {
          
          }
          

          请注意,它们必须是 const char* 而不是 char*

          【讨论】:

            【解决方案5】:

            您可以使用std::initializer_list

            for (auto& tup : std::initializer_list<std::tuple<const char*, const char*>> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} })
            {
                std::cout << std::get<0>(tup) << ", " << std::get<1>(tup) << std::endl;
            }
            

            https://godbolt.org/z/LuuTuH

            我不得不说,这读起来很难看。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-11-08
              • 2019-03-17
              • 2019-11-16
              • 2013-04-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多