【问题标题】:C++ - How to print a tuple consisting of vectorsC++ - 如何打印由向量组成的元组
【发布时间】:2016-06-03 06:42:02
【问题描述】:

我需要打印元组“taborder”中包含的向量。 下面的代码

std::vector<std::tuple< std::vector<int>, std::vector<int>, std::vector<int> > > taborder;

for (int i = 1; i < 4; i++){
    std::vector<int> id (i,5);
    std::vector<int> x (i,10);
    std::vector<int> y (i,15);
    taborder.push_back(std::make_tuple(id, x, y));
}

for(vector<tuple>::iterator iter = taborder.begin(); iter != taborder.end(); iter++){
cout << get<0>(*iter) << "\t" << get<1>(*iter) << "\t" << get<2>(*iter) << endl;
}

产生错误:

type/value mismatch at argument 1 in template parameter list for 'template&lt;class _Tp, class _Alloc&gt; class std::vector'|

【问题讨论】:

    标签: c++ vector tuples


    【解决方案1】:

    你搞砸了外部向量迭代和内部向量之一。

    您可以使用新标准中的 auto 功能来减少命名膨胀,并使用编译器来推断确切的类型,并使用每个循环来简化代码。

    Here你可以找到你的代码的工作示例

    #include <iostream>
    #include <tuple>
    #include <vector>
    
    using namespace std;
    
    int main() {
    
        std::vector<std::tuple< std::vector<int>, std::vector<int>, std::vector<int> > > taborder;
    
        for (int i = 1; i < 4; i++){
            std::vector<int> id (i,5);
            std::vector<int> x (i,10);
            std::vector<int> y (i,15);
            taborder.push_back(std::make_tuple(id, x, y));
        }
    
        for(auto & outer_vec_elem : taborder){
            auto & inner_vec0 = get<0>(outer_vec_elem);
            auto & inner_vec1 = get<1>(outer_vec_elem);
            auto & inner_vec2 = get<2>(outer_vec_elem);
    
            for(auto inner_vec_elem : inner_vec0){
                cout << inner_vec_elem << "\t";
            }
            for(auto inner_vec_elem : inner_vec1){
                cout << inner_vec_elem << "\t";
            }
            for(auto inner_vec_elem : inner_vec2){
                cout << inner_vec_elem << "\t";
            }
        }
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      您似乎没有完全指定迭代器的类型

      使用 auto 或用于 C++11 之前的编译器

      vector&lt;tuple&lt; std::vector&lt;int&gt;, std::vector&lt;int&gt;, std::vector&lt;int&gt; &gt; &gt;::iterator

      同样在你的主循环中,你必须遍历每个元组内的内部向量

      以下是您可以使用的或多或少的变体,具体取决于您希望输出的方式:

      1.变体:元组输出(假设所有向量具有相同的大小)

      int main() {
          std::vector<std::tuple< std::vector<int>, std::vector<int>, std::vector<int> > > taborder;
      
          for (int i = 1; i < 4; i++){
              std::vector<int> id (i,5);
              std::vector<int> x (i,10);
              std::vector<int> y (i,15);
              taborder.push_back(std::make_tuple(id, x, y));
          }
      
          for(vector<tuple< std::vector<int>, std::vector<int>, std::vector<int> > >::iterator iter = taborder.begin(); iter != taborder.end(); iter++){
          // or  
          // for(auto iter = taborder.begin(); iter != taborder.end(); iter++){
      
              auto mytuple = *iter;
      
              // You have to iterate over all the inner vectors
      
              for (unsigned int i = 0; i < get<0>(mytuple).size(); ++i ) {
                  cout << get<0>(mytuple)[i] << "\t" << get<1>(mytuple)[i] << "\t" << get<2>(mytuple)[i] << endl;
              }
          }
      }
      

      2。变体:每个元组向量(正如其他分析器已经显示的那样)

      int main() {
          std::vector<std::tuple< std::vector<int>, std::vector<int>, std::vector<int> > > taborder;
      
          for (int i = 1; i < 4; i++){
              std::vector<int> id (i,5);
              std::vector<int> x (i,10);
              std::vector<int> y (i,15);
              taborder.push_back(std::make_tuple(id, x, y));
          }
      
          for(vector<tuple< std::vector<int>, std::vector<int>, std::vector<int> > >::iterator iter = taborder.begin(); iter != taborder.end(); iter++){
          // or  
          // for(auto iter = taborder.begin(); iter != taborder.end(); iter++){
      
              auto mytuple = *iter;
      
              for (unsigned int i = 0; i < get<0>(mytuple).size(); ++i ) {
                  cout << get<0>(mytuple)[i] << "\t";
              }
              cout << endl;
      
              for (unsigned int i = 0; i < get<1>(mytuple).size(); ++i ) {
                  cout << get<1>(mytuple)[i] << "\t";
              }
              cout << endl;            
      
              for (unsigned int i = 0; i < get<2>(mytuple).size(); ++i ) {
                  cout << get<2>(mytuple)[i] << "\t";
              }
              cout << endl;
          }
      }
      

      【讨论】:

      • 太棒了,鉴于向量大小不同,您的第二个提议更可口。
      猜你喜欢
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2019-10-14
      • 2015-01-14
      相关资源
      最近更新 更多