用C ++打印数组?

时间:2009-09-02 21:48:54

标签: c++ arrays printing reverse

有没有办法用C ++打印数组?

我正在尝试创建一个反转用户输入数组的函数,然后将其打印出来。我试过谷歌搜索这个问题,似乎C ++无法打印数组。这不可能是真的吗?

13 个答案:

答案 0 :(得分:46)

使用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";
}

答案 1 :(得分:44)

你不能只迭代这些元素吗?像这样:

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

注意:正如Maxim Egorushkin指出的那样,这可能会溢出。请参阅下面的评论以获得更好的解决方案。

答案 2 :(得分:27)

我建议使用鱼骨操作员吗?

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

(你能发现它吗?)

答案 3 :(得分:12)

除了基于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's template sugar也很不错。

修改:忘记“反向打印”要求。这是一种方法:

#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

编辑:使用std::begin()std::rbegin()等数组迭代器函数简化上述代码段的C ++ 14更新:

#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"));
}

答案 4 :(得分:6)

声明的数组声明的数组,但以其他方式创建,特别是使用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;
}

当然,您也可以将此模板设为接受其他类型的矢量。

答案 5 :(得分:3)

C ++中常用的大多数库本身都无法打印数组。您必须手动循环并打印出每个值。

打印数组并转储许多不同类型的对象是更高级语言的一项功能。

答案 6 :(得分:3)

当然是!您必须循环遍历阵列并单独打印出每个项目。

答案 7 :(得分:3)

如果您对其进行编程,C ++可以打印您想要的任何内容。你必须自己打印每个元素。

答案 8 :(得分:1)

这可能会有所帮助 //打印数组

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

n是数组的大小

答案 9 :(得分:-1)

我的简单答案是:

#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;
}

答案 10 :(得分:-1)

// Just do this, use a vector with this code and you're good lol -Daniel

#include <Windows.h>
#include <iostream>
#include <vector>

using namespace std;


int main()
{

    std::vector<const char*> arry = { "Item 0","Item 1","Item 2","Item 3" ,"Item 4","Yay we at the end of the array"};
    
    if (arry.size() != arry.size() || arry.empty()) {
        printf("what happened to the array lol\n ");
        system("PAUSE");
    }
    for (int i = 0; i < arry.size(); i++)
    {   
        if (arry.max_size() == true) {
            cout << "Max size of array reached!";
        }
        cout << "Array Value " << i << " = " << arry.at(i) << endl;
            
    }
}

答案 11 :(得分:-1)

不能仅通过将数组传递给函数来打印数组。因为c++中没有这样的函数。 这样做:

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

答案 12 :(得分:-2)

或者你可以使用它:https://github.com/gileli121/VectorEx

您可以使用DisplayVector_1d()轻松显示数组。 它是在visual studio 2015下开发的。只能在windows下运行(在Windows 7 64位上测试)。

您在此库中查看的内容是DisplayVector_1d。我

它将在listview GUI中显示数组。它就像Autoit中的_ArrayDisplay函数。

以下是如何使用它的示例:

// 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;
}

Example that shows how to use DisplayVector_1d in VectorDisplay.h

请注意,我刚刚开始研究这个项目。欢迎您改进代码并修复错误