web-dev-qa-db-ja.com

C ++で配列を印刷しますか?

C++で配列を印刷する方法はありますか?

私は、ユーザー入力配列を反転してから出力する関数を作成しようとしています。この問題をグーグルで試してみましたが、C++は配列を出力できないようです。それは真実ではないでしょうか?

45
JohnHemmars

要素を繰り返し処理することはできませんか?このような:

for (int i = numElements - 1; i >= 0; i--) 
    cout << array[i];

注:Maxim Egorushkinが指摘したように、これはオーバーフローする可能性があります。より良い解決策については、以下の彼のコメントを参照してください。

48
Botz3000

STLを使用する

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
    std::vector<int>    userInput;

    // Read until end of input.
    // Hit control D  
    std::copy(std::istream_iterator<int>(std::cin),
              std::istream_iterator<int>(),
              std::back_inserter(userInput)
             );

    // Print in Normal order
    std::copy(userInput.begin(),
              userInput.end(),
              std::ostream_iterator<int>(std::cout,",")
             );
    std::cout << "\n";

    // Print in reverse order:
    std::copy(userInput.rbegin(),
              userInput.rend(),
              std::ostream_iterator<int>(std::cout,",")
             );
    std::cout << "\n";

    // Update for C++11
    // Range based for is now a good alternative.
    for(auto const& value: userInput)
    {
        std::cout << value << ",";
    }
    std::cout << "\n";
}
47
Martin York

魚骨演算子を使用することをお勧めしますか?

for (auto x = std::end(a); x != std::begin(a); )
{
    std::cout <<*--x<< ' ';
}

(見つけられますか?)

30
fredoverflow

Forループベースのソリューションに加えて、 ostream_iterator <> も使用できます。 (廃止された)SGI STLリファレンスのサンプルコードを活用する例を次に示します。

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
  short foo[] = { 1, 3, 5, 7 };

  using namespace std;
  copy(foo,
       foo + sizeof(foo) / sizeof(foo[0]),
       ostream_iterator<short>(cout, "\n"));
}

これにより、以下が生成されます。

 ./a.out 
1
3
5
7

ただし、これはあなたのニーズには行き過ぎかもしれません。 litbのテンプレートシュガー も非常にいいですが、必要なのはおそらく単純なforループだけです。

Edit:「逆に印刷する」要件を忘れました。これを行う1つの方法を次に示します。

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
  short foo[] = { 1, 3, 5, 7 };

  using namespace std;

  reverse_iterator<short *> begin(foo + sizeof(foo) / sizeof(foo[0]));
  reverse_iterator<short *> end(foo);

  copy(begin,
       end,
       ostream_iterator<short>(cout, "\n"));
}

そして出力:

$ ./a.out 
7
5
3
1

Editstd :: begin() などの配列イテレータ関数を使用して、上記のコードスニペットを簡素化するC++ 14アップデート std :: rbegin()

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    short foo[] = { 1, 3, 5, 7 };

    // Generate array iterators using C++14 std::{r}begin()
    // and std::{r}end().

    // Forward
    std::copy(std::begin(foo),
              std::end(foo),
              std::ostream_iterator<short>(std::cout, "\n"));

    // Reverse
    std::copy(std::rbegin(foo),
              std::rend(foo),
              std::ostream_iterator<short>(std::cout, "\n"));
}
13
Void

宣言済み配列not宣言された配列がありますが、特にnewを使用して作成されます。

int *p = new int[3];

3つの要素を持つその配列は動的に作成され(その3も実行時に計算できた)、その型からサイズが消去された配列へのポインターがpに割り当てられます。サイズを取得してその配列を印刷することはできません。したがって、それへのポインタのみを受け取る関数は、その配列を出力できません。

宣言された配列の印刷は簡単です。 sizeofを使用してサイズを取得し、そのサイズを配列の要素へのポインタを含む関数に渡すことができます。ただし、配列を受け入れ、宣言された型からそのサイズを推測するテンプレートを作成することもできます。

template<typename Type, int Size>
void print(Type const(& array)[Size]) {
  for(int i=0; i<Size; i++)
    std::cout << array[i] << std::endl;
}

これの問題は、ポインターを受け入れないことです(明らかに)。最も簡単な解決策は、std::vectorを使用することだと思います。 sizeメンバー関数を持つ動的でサイズ変更可能な「配列」(実際のセマンティクスを使用)です。

void print(std::vector<int> const &v) {
  std::vector<int>::size_type i;
  for(i = 0; i<v.size(); i++)
    std::cout << v[i] << std::endl;
}

もちろん、これを他のタイプのベクターを受け入れるテンプレートにすることもできます。

C++で一般的に使用されるライブラリのほとんどは、配列自体を印刷できません。手動でループして、各値を印刷する必要があります。

配列の印刷とさまざまな種類のオブジェクトのダンプは、高レベル言語の機能です。

3

確かにそうです!配列をループして、各項目を個別に印刷する必要があります。

3
Andy Mikula

C++は、プログラムを作成すれば、必要なものをすべて印刷できます。各要素を印刷して自分で配列を調べる必要があります。

3
Cogwheel

これは//配列の印刷に役立つかもしれません

for (int i = 0; i < n; i++)
{cout << numbers[i];}

nは配列のサイズです

2

私の簡単な答えは:

#include <iostream>
using namespace std;

int main()
{
    int data[]{ 1, 2, 7 };
    for (int i = sizeof(data) / sizeof(data[0])-1; i >= 0; i--) {
        cout << data[i];
    }

    return 0;
}
0
ej8000