Печать массива на C++?
есть ли способ печати массивов в C++?
Я пытаюсь сделать функцию, которая изменяет массив пользовательского ввода, а затем распечатывает его. Я попытался погуглить эту проблему, и казалось, что c++ не может печатать массивы. Это не может быть правдой, не так ли?
11 ответов
вы не можете просто перебирать элементы? вот так:
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";
}
могу ли я предложить использовать оператора fish bone?
for (auto x = std::end(a); x != std::begin(a); )
{
std::cout <<*--x<< ' ';
}
(вы можете определить это?)
помимо решений на основе for-loop, вы также можете использовать 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-loop, вероятно, все, что вам нужно, хотя шаблон 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
здесь объявлены массивы и массивы,не объявлено, но в противном случае создано, особенно с помощью 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++ ,не могут печатать массивы как таковые. Вам придется пройти через него вручную и распечатать каждое значение.
печать массивов и сброс многих различных типов объектов является особенностью языков более высокого уровня.
C++ может печатать все, что вы хотите, если вы запрограммируете его, чтобы сделать так. Вам придется пройти через массив самостоятельно, печатая каждый элемент.
мой простой ответ:
#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;
}
или вы можете использовать это: https://github.com/gileli121/VectorEx
вы можете легко отобразить массив с помощью DisplayVector_1d (). Он разработан в visual studio 2015. t работает только под windows (проверено на windows 7 64 бит).
то, что вы ищете в этой библиотеке, - DisplayVector_1d. Я!--4-->
он отобразит массив в графическом интерфейсе 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;
}