簡體   English   中英

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

[英]C++ - How to print a tuple consisting of vectors

我需要打印包含在元組“ 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' |

您搞砸了外部向量迭代和內部向量迭代。

您可以使用新標准中的自動功能來減少命名膨脹,並使用編譯器來推導確切的類型,並使用每個循環來簡化代碼。

在這里您可以找到代碼的工作示例

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

似乎您沒有完成為迭代器指定類型的操作

使用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.variant :每個元組向量 (如其他anser所示)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM