2014-01-30 3 views
1

Я делаю несколько тестов массивов векторов, и я не знаю, как их распечатать. Вот мой код:Печать векторных массивов в C++

#include <iostream> 
#include <string> 
#include <cstring> 
#include <algorithm> 
#include "vector" 
#include <windows.h> 

using namespace std; 

vector<vector<int>> generateArrays(){ 

vector<vector<int>> cisla; 

for(unsigned int i=1; i < 11; i++){ 
    vector<int> pole; 
    vector<int> pole2; 
    for(unsigned int j=0; j < i*5; j++){ 
     int a = rand(); 
     pole.push_back(a); 
     pole2.push_back(a); 
    } 
    cisla.push_back(pole); 
    cisla.push_back(pole2); 
} 
return cisla; 
} 

vector<vector<int>> arrays = generateArrays(); 


void Print (const vector<int>& arrays){ 
    // function for prinitng arrays 
} 


int main(){ 
    Print(arrays); 
    system("pause"); 
} 

Что мне нужно есть некоторая функция, чтобы записать все числа в векторных массивах. Я пытался использовать Google, но ни один из кодов не работает для меня.

+1

[общие решения] (http://stackoverflow.com/questions/4850473/pretty-print-c-stl-containers). – Jarod42

+0

Не утруждайте себя ответами, прочтите ссылку Джарода. – Xarn

ответ

2
// requires #include <algorithm> for std::copy 
// requires #include <iterator> for std::ostream_iterator 
void Print(const vector<vector<int>>& arrays, std::ostream& out = std::cout) 
{ 
    for(const auto& array:arrays) { 
     std::copy(array.begin(), array.end(), std::ostream_iterator<int>(out, " ")); 
     out << std::endl; 
    } 
} 
0

Вы можете использовать вектор :: итератор, например:

vector<vector<int>>::iterator i = arrays.begin(); 
vector<int>::iterator j = *i.begin(); 

for(;i != arrays.end(); ++i) { 
    for(;j != *i.end(); ++j) { 
    std::cout << *j << " "; 
    } 
    std::cout << "\n"; 
} 
+1

Я думаю, что опубликованный код не будет работать так, как ожидалось, потому что j никогда не перезагружается в * i.begin() внутри внешнего for-loop. – duselbaer

+0

Было бы более идиоматично инициализировать итераторы в предложении инициализации 'for'-statement. В любом случае вам нужно повторно инициализировать 'j' для каждой итерации внешнего цикла. Кроме того, это должно быть 'i-> begin()' или '(* i) .begin()', а не '* i.begin()'. –

0

Что об этом?

Создать оператор выходной поток для вектора T, как это:

template <typename T> 
std::ostream& operator<<(std::ostream& os, std::vector<T> const & array) 
    bool seenFirst = false; 
    os << "[ "; 
    for (auto const & i : array) 
    { 
     if (!seenFirst) 
     { 
      seenFirst = true; 
      os << i; 
     } 
     else 
     { 
      os << ", " << i; 
     } 
    } 
    os << "]"; 
    return os; 
} 

В конце вы можете использовать его для std::vector<int>, а также для std::vector< std::vector <int> > как это:

std::cout << arrays; 
0

Если у вас есть Print, как показано на рисунке , то

void Print (const vector<int>& arrays){ 
    for(auto x:arrays) 
    std::cout << x <<" "; 
} 

int main(){ 

    for(const auto& array:arrays) 
    Print(array); 

    system("pause"); 
} 

В противном случае вы можете комбинировать как в одной функции, как

void Print (const vector<vector<int>>& arrays){ 

    for(const auto& array:arrays) 
    for(auto x:array) 
    std::cout << x <<" "; 
} 
0

Как вы уже std::vector<std::vector<int>> то функция может выглядеть

void Print(const std::vector<std::vector<int>> &arrays) 
{ 
    for (const std::vector<int> &v : arrays) 
    { 
     for (int x : v) std::cout << x << ' '; // you can include std::setw here 
     std::cout << std::endl; 
    } 
} 

Или, если вам нужно вывести только std::vector<int> то это будет выглядеть, как

void Print(const std::vector<int> &arrays) 
{ 
    for (int x : arrays) std::cout << x << ' '; // you can include std::setw here 
} 

Если ваш компилятор не поддерживает диапазон, основанный на выражении, то вы можете использовать, например, стандартный алгоритм станд :: копия.

void Print(const std::vector<int> &arrays) 
{ 
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

Или вы можете использовать обычный цикл

void Print(const std::vector<int> &arrays) 
{ 
    for (std::vector<int>::size_type i = 0; i < arrays.size(); i++) 
    {   
     std::cout << arrays[i] << ' '; // you can include std::setw here 
    } 
} 

Или с итераторы

void Print(const std::vector<int> &arrays) 
{ 
    for (auto it = arrays.begin(); it != arrays.end(); ++it) 
    {   
     std::cout << *it << ' '; // you can include std::setw here 
    } 
} 
0
void Print (const vector<int>& arrays){ 
    for (std::vector<int>::iterator it = arrays.begin() ; 
      it != arrays.end(); 
      ++it) 
    std::cout << ' ' << *it; 
} 
0
#include <algorithm> 

vector<vector<int>>::iterator it = arrays.begin(); 
while (!(it == arrays.end()) { 
    std::copy((*it).begin(), (*it).end(), 
            std::ostream_iterator<int>(std::cout, ",")); 
    ++it; 
} 
0

В C++ 11``

for (auto i = path.begin(); i != path.end(); ++i) 
std::cout << *i << ' '; 

for(int i=0; i<path.size(); ++i) 
std::cout << path[i] << ' '; 
Смежные вопросы