C ++ - 如何打印由向量组成的元组

时间:2016-06-03 06:42:02

标签: c++ vector tuples

我需要打印Tuple“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<class _Tp, class _Alloc> class std::vector' |

2 个答案:

答案 0 :(得分:0)

你搞砸了外部矢量迭代和内部矢量。

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

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;
}

答案 1 :(得分:0)

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

使用auto或预编译C ++ 11编译器

vector<tuple< std::vector<int>, std::vector<int>, std::vector<int> > >::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;
    }
}