Печать массива в C++?

Я на самом деле должен был сделать это как раз сегодня. Действительно простой способ сделать это находится в терминале, так тип:

cat [directory of external disk] > ~/newfile.iso

Для нахождения каталога внешнего диска открывают средство запуска Единицы и ищут "Системный монитор", затем перейдите к "Файловым системам".

, Таким образом, пример был бы похож:

cat /dev/scd0 > ~/newfile.iso
46
задан 2 September 2009 в 21:48
поделиться

7 ответов

Просто перебираем элементы. Как это:

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

Примечание: Как указал Максим Егорушкин, это могло переполниться. См. Его комментарий ниже для лучшего решения.

50
ответ дан 26 November 2019 в 20:03
поделиться

Используйте курсоры 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
ответ дан 26 November 2019 в 20:03
поделиться

Есть объявленных массивов и массивов, которые не объявлены, а созданы иным образом, в частности, с использованием 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;
}

Вы, конечно, также можете сделать это шаблоном для принимать векторы других типов.

6
ответ дан 26 November 2019 в 20:03
поделиться

Помимо решений на основе цикла 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

Однако это может быть излишним для ваших нужд. Прямой цикл for - это, вероятно, все, что вам нужно, хотя шаблон litb тоже неплох.

Правка : Забыл о требовании «печати в обратном направлении». Вот один из способов сделать это:

#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

Edit : обновление C ++ 14, которое упрощает приведенные выше фрагменты кода с использованием функций итератора массива, таких как std :: begin () и 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
ответ дан 26 November 2019 в 20:03
поделиться

Большинство библиотек, обычно используемых в C ++, не могут печатать массивы как таковые. Вам придется пройти его вручную и распечатать каждое значение.

Печать массивов и выгрузка различных типов объектов - это функция языков более высокого уровня.

3
ответ дан 26 November 2019 в 20:03
поделиться

C ++ может печатать все, что вы хотите, если вы запрограммируете его для этого. Вам придется самостоятельно просматривать массив, печатая каждый элемент.

3
ответ дан 26 November 2019 в 20:03
поделиться

Несомненно! Вам придется просмотреть массив и распечатать каждый элемент отдельно.

3
ответ дан 26 November 2019 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: