用 C + + 打印数组? ?

在 C + + 中有打印数组的方法吗?

我试图创建一个函数来反转一个用户输入数组,然后将其打印出来。我试过在 Google 上搜索这个问题,但似乎 C + + 不能打印数组。这不可能是真的吧?

524267 次浏览

大多数 C + + 中常用的库本身不能打印数组。您必须手动遍历它并打印出每个值。

打印数组和转储许多不同类型的对象是高级语言的一个特征。

当然可以! 您必须遍历数组并单独打印出每个条目。

对元素进行迭代,像这样:

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

注意: 正如 Maxim Egorushkin 指出的,这可能会溢出。

有一些 声明的数组和数组声明为 没有,但是以其他方式创建,特别是使用 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 循环的解决方案之外,还可以使用 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 的模板 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

编辑 : C + + 14更新,使用像 开始()Rstart ()这样的数组迭代器函数简化上面的代码片段:

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

使用 STL

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


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)
);


// ITs 2021 now move this up as probably the best way to do it.
// Range based for is now "probably" the best alternative C++20
// As we have all the range based extension being added to the language
for(auto const& value: userInput)
{
std::cout << value << ",";
}
std::cout << "\n";


// Print the array in reverse using the range based stuff
for(auto const& value: userInput | std::views::reverse)
{
std::cout << value << ",";
}
std::cout << "\n";




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


}

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

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

(你能看出来吗?)

我的答案很简单:

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

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

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

N 是数组的大小

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

}
}
std::string ss[] = { "qwerty", "asdfg", "zxcvb" };
for ( auto el : ss ) std::cout << el << '\n';

工作原理和 Foreach 差不多。