2017-01-28 2 views
0

ベクトルの内容を印刷するために使用することができる<<コードの下ベクトルの最初のn個の値を印刷するオペレータ(全体ではなくベクトル)

template <class T> 
ostream & operator << (ostream & out, const vector<T> & data) 
{ 
    out << "["; 
    for (int i = 0; i < (int) data.size(); ++i) 
     out << data[i] << (i == data.size() - 1 ? "" : ","); 
    out << "]"; 
    return out; 
} 

質問オーバーロード:ベクトルの大きさが5000とだけ最初のn個ある場合
1) (たとえば10個)の要素が値を格納していて、他の要素が使用されていない場合、最初のn個の値だけを出力するようにこのコードを変更する方法はありますか?

2)私は、2Dベクトルを印刷しようとした -

template <class T> 
ostream & operator << (ostream & out, const vector<vector<T>> & data) 
{ 
    out << "["; 
    for (int i = 0; i < (int) data.size(); ++i) 
    { 
     for (int j = 0; j < (int) data[i].size(); ++j) 
      out << data[i][j] << (j == data[i].size() - 1 ? "" : ","); 
     out << endl; 
    } 
    out << "]"; 
    return out; 
} 

が、これは動作しません。だから、1)全体の2Dベクトルを印刷する適切な方法は何ですか? 2)いくつかのn * mの値(1dベクトルの最初の質問で2dベクトル全体ではない)?

+0

ベクトルのサイズが5000の場合、ベクトルは5000個の値を格納しています。ベクトルには値以外の概念はありません。 –

+0

@Benjamin Lindley - 競合プログラミングでは、より多くのテストケースがある場合、最大入力サイズのグローバルベクトルを宣言するために使用されますが、ほとんどのテストケースでは、全体ベクトルは使用されません。 –

答えて

1

従来、ストリーミング用operator<<()は完全なオブジェクトを再作成するために、出力に必要なデータのすべてを実装している:あなたは、次の実装する場合

std::vector<int> values = ... 
std::cout << head(values, 10) << '\n'; 

をしたがって、operator>>()は、その後、ストリームから読み取ったときにオブジェクトのコピーを再構築することができます。

ベクターには、その要素がそうでない限り、「未使用」という概念はありません。たとえば、std::vector<SomeType *>の場合、すべての非NULL要素を出力することができます。

特定の値を持つ要素を破棄しながら、指定した数の要素をstd::vector<std::vector<T> >に出力する場合は、そのような機能を実装します。

template<template <class T> 
    std::ostream & OutputSubset (std::ostream & out, const vector<vector<T> > & data, std::size_t number, T discard) 
    { 
     if (number > data.size()) number = data.size(); 
     for (std::size_t i = 0; i < number; ++i) 
     { 
      for (std::size_t j = 0; j < number; ++j) 
       if (data[i][j] != discard) out << ' ' << data[i][j]; 
      out << '\n'; 
     } 
     return out; 
    } 
+0

あなたのコードはそれを見てみてください動作していません。 –

+0

「機能していません」は不特定の記述です。私は心配する人ではありません。ここでのコードは、あなたの不特定のコードへのドロップイン解決策ではなく、アプローチを実証するために書かれています(つまり、 'operator <<()'とは異なる機能を使用します)。 – Peter

0

あなたはこのような何か行うことができます。

template <typename T> 
struct HeadPrinter 
{ 
    HeadPrinter(const T& container, size_t count) 
    : _container(container), _count(count) {} 

    const T& _container; 
    size_t _count; 
}; 

template <typename T> 
HeadPrinter<T> head(const T& container, size_t count) 
{ 
    return HeadPrinter<T>(container, count); 
} 

template <typename T> 
std::ostream& operator<<(std::ostream& out, const HeadPrinter<T>& printer) 
{ 
    size_t count = std::min(printer._count, printer._container.size()); 
    out << '['; 
    for (size_t ii = 0; ii < count; ++i) { 
    out << printer._container[ii]; 
    if (ii + 1 < count) { 
     out << ','; 
    } 
    } 
    return out << ']'; 
} 
+0

ありがとう! 2Dベクトルのために何をすべきか? –

+0

@knock_out:質問ごとに1つ質問してください。おそらく、新しい質問として2番目の質問を投稿してください。 –

関連する問題