在c++中处理数组

Working with arrays in C++

本文关键字:数组 处理 c++      更新时间:2023-10-16

我正试图让这个简单的程序工作,但我有一些错误,我不明白,因为我是新的c++。我在函数初始化的范围内没有声明,并且在函数头中使用数组有麻烦。有人能帮帮我吗?

我的代码如下:
#include <iostream>
#include <string>
using namespace std;
char[][] initialize(char[][]);
int main(){
    int array[3][3];
    initialize(array);
    cout << array[0];
    return 0;
}
char[][] initialize(char[][] a){
    for(int i = 0; i < a.length(); i++){
        for(int j = 0; j < a[].length(); j++){
            a[i][j] = '';
        }
    }
    return a;
}

你可以初始化你的2d数组元素为:

char array[3][3] = {0};

现在,如果你想传递你的数组给一个函数(例如,print_2d_array()),为了有你的二维数组的尺寸,你需要通过引用传递你的数组,按照以下方式:

template<typename T, std::size_t N, std::size_t M>
void print_2d_array(T (&a)[N][M]){
    for(int i = 0; i < N; ++i){
        for(int j = 0; j < M; ++j){
            std::cout << a[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

上面的函数打印任意类型/维数的2d数组

如果你有固定大小的数组,你可以(而且应该)使用std::array而不是原始的c风格数组。我将使用initialize函数作为示例,尽管还有其他方法可以初始化数组。

#include <iostream>
#include <string>
#include <array>
using namespace std;
void initialize(std::array<std::array<char, 3>, 3>&);
int main(){
    std::array<std::array<char, 3>, 3> array{};
    initialize(array);
    return 0;
}
void initialize(std::array<std::array<char, 3>, 3>& a) {
    for(auto& outer: a) {
        for(auto& x: outer) {
             x = '';
        }
    }
}

当然,如果你想处理字符串数组,这是我认为你真正想要的,你应该这样做,并使用std::string而不是零终止的c风格字符串。

#include <iostream>
#include <string>
#include <array>

int main(){
    std::array<std::string, 3> array{};
    array.fill( std::string(3, '') );
    std::cout << array[0];
    return 0;
}

在本例中不需要初始化,因为std::string已由其构造函数正确初始化。

如果你需要动态存储,你应该使用std::vector而不是std::array。在任何情况下,我的建议是使用类型安全且更方便的c++工具,而不是使用容易出错且坦率地说很痛苦的C等价工具。

因为你知道数组的大小和通过引用传递数组,所以不需要返回数组:

void initialize(char[][3]);//declaration

功能:

void initialize(char a[][3]){
//no such function as array.lenth()
for(int i = 0; i < 3; i++){
    for(int j = 0; j <3; j++){
        a[i][j] = '';
    }
}

我也可以看到你已经声明了一个整数数组,并传递给一个字符数组。要么用整数数组要么用char数组,但不能两者都用

技巧一:通过将函数定义放在main之前来节省前向声明initialize的麻烦。这消除了一个潜在的错误来源。

技巧二:Jens比我先。使用std::数组。

技巧三:使用std::vector.

#include <iostream>
#include <string>
#include <vector>
//using namespace std; this can be dangerous. Recommend the following as a replacement
using std::vector;
using std::cout;
void initialize(vector<vector<char>> &a) // pass vector by reference 
{   
    for(int i = 0; i < a.size(); i++)
    {   
        for(int j = 0; j < a[i].size(); j++)
        {   
            a[i][j] = '';
        }
    }
}
int main()
{
    vector<vector<char>> array(3, vector<char>(3));
    initialize(array);
    cout << array[0][0];
    return 0;
}

这里有两点需要说明

  1. 这有性能问题。向量的向量(或数组的数组)不太可能具有连续性(内存都在一个块中),并且会导致将数组数据从RAM加载到缓存的不必要延迟。如果所有的数据都靠近在一起,并且足够小,则一次缓存读取将获得整个数组。如果它是分散的,每一块都需要单独读取,加载一块可能会覆盖另一块,迫使它再次加载(这可能会写另一块内存需要几个指令后,迫使它被重新读取,这可能会迫使另一块或另一块,无限。

  2. std::vector可以为你初始化数组的内容

由于某种原因,这里需要文本来保留下一个代码块的格式。奇怪。

int main()
{
    vector<vector<char>> array(3, vector<char>(3), '');
    cout << array[0][0];
    return 0;
}

如果由于分配限制,您不允许使用std::arraystd::vector,那么很容易编写std::array的简单克隆。

struct TwoD
{
    char array[3][3];
    char &operator()(int row, int col)
    {
        return array[row][col];
    }
};