Есть ли способ печати массивов на С++?
Я пытаюсь сделать функцию, которая меняет входной массив пользователя, а затем печатает его. Я попробовал проблему с Google, и казалось, что С++ не может печатать массивы. Это не может быть правдой?
Есть ли способ печати массивов на С++?
Я пытаюсь сделать функцию, которая меняет входной массив пользователя, а затем печатает его. Я попробовал проблему с Google, и казалось, что С++ не может печатать массивы. Это не может быть правдой?
Просто переберите элементы. Вот так:
for (int i = numElements - 1; i >= 0; i--)
cout << array[i];
Примечание: как отметил Максим Егорушкин, это может переполниться. Смотрите его комментарий ниже для лучшего решения.
Используйте 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";
}
Могу ли я предложить использовать оператора рыбой?
for (auto x = std::end(a); x != std::begin(a); )
{
std::cout <<*--x<< ' ';
}
(Можете ли вы это заметить?)
Помимо решений на основе циклы, вы также можете использовать 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
Однако это может быть излишним для ваших нужд. Прямо для циклы, вероятно, все, что вам нужно, хотя ламповый шаблонный сахар тоже неплох.
Изменить: Забыл "печать в обратном порядке". Вот один из способов сделать это:
#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
Изменить: обновление С++ 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"));
}
Объявлены массивы и массивы, которые не объявлены, но созданы иным образом, в частности, используя 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;
}
Вы можете, конечно, также сделать этот шаблон для принятия векторов других типов.
Большинство библиотек, обычно используемых на С++, не могут печатать массивы, как таковые. Вам нужно будет пропустить его вручную и распечатать каждое значение.
Печатные массивы и демпинг многих различных объектов - это функция языков более высокого уровня.
Конечно! Вам нужно будет пройти через массив и распечатать каждый элемент по отдельности.
С++ может печатать все, что вы хотите, если вы его запрограммируете. Вам придется пройти через массив, который печатает каждый элемент.
Это может помочь//Печать массива
for (int i = 0; i < n; i++)
{cout << numbers[i];}
n - размер массива
Мой простой ответ:
#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;
}
Поезд ушел? Почему бы просто:
float data[16] = {};
// filling some array data...
for(float i : data) {
std::cout << i << std::endl;
}
Или вы можете использовать это: https://github.com/gileli121/VectorEx
Вы можете легко отобразить массив с помощью DisplayVector_1d(). Он разрабатывался под визуальной студией 2015. t работает только под окнами (протестирован на Windows 7 64 бит).
То, что вы просматриваете в этой библиотеке, - DisplayVector_1d. I
Он отобразит массив в графическом интерфейсе listview. это похоже на функцию _ArrayDisplay в Autoit.
Вот пример того, как это использовать:
// includes.functions
#include <windows.h>
#include "VectorEx\VectorEx.h"
#include "VectorEx\VectorDisplay.h"
using namespace vectorex;
using namespace vectordisplay;
/*
This example shows how to use display std::vector array datatype
with vectordisplay::DisplayVector_1d
*/
int main()
{
std::vector<std::string> stringVector;
stringVector.push_back("Bob");
stringVector.push_back("Fob");
stringVector.push_back("Rob");
stringVector.push_back("Nob");
DisplayVector_1d(&stringVector);
return 0;
}
Обратите внимание, что я только начал работать над этим проектом. Вы можете улучшить код и исправить ошибки.
Для двухмерного массива:
int main (){
// My array:
string myarray[5][2] = { {"a","b" }, {"b","c"}, {"a","c"}, {"c","d"}, {"b","d"} };
for (int i=0; i< sizeof(myarray)/sizeof(myarray[0]); i++)
for (int j=0; j< sizeof(myarray[i])/sizeof(myarray[i][0]); j++)
cout << myarray[i][j];
return 0;
}
Для простого массива:
int main (){
// My array:
int myarray[5] = {1,2,3,4,5};
for (int i=0; i< sizeof(myarray)/sizeof(myarray[0]); i++)
cout << myarray[i];
return 0;
}