本文介绍了我如何最好地处理在C / C ++动态多维数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么是公认的/最常用的方法来处理动态(含直到运行时才知道的所有维度)的C和/或C多维数组++。

What is the accepted/most commonly used way to manipulate dynamic (with all dimensions not known until runtime) multi-dimensional arrays in C and/or C++.

我试图找到实现这个Java code做什么最干净的方式:

I'm trying to find the cleanest way to accomplish what this Java code does:

public static void main(String[] args){
 Scanner sc=new Scanner(System.in);
 int rows=sc.nextInt();
 int cols=sc.nextInt();
 int[][] data=new int[rows][cols];
 manipulate(data);
}

public static void manipulate(int[][] data){
   for(int i=0;i<data.length;i++)
   for(int j=0;j<data[0].length.j++){
         System.out.print(data[i][j]);
   }
}

(读取std_in只是为了澄清,尺寸不知道,直到运行时)。

(reads from std_in just to clarify that dimensions aren't known until runtime).

编辑:我注意到这个问题是pretty受欢迎即使它是pretty岁。我真的不同意顶级投回答。我认为,对C的最佳选择是使用一维数组作为古格说,下面的你可以的Alloc行* COLS *的sizeof(int)和由表访问它[行* COLS + COL]。

I noticed that this question is pretty popular even though it's pretty old. I don't actually agree with the top voted answer. I think the best choice for C is to use a single-dimensional array as Guge said below "You can alloc rows*cols*sizeof(int) and access it by table[row*cols+col].".

有是一些用C ++的选择,如果你真的喜欢升压或STL然后在下面的答案可能是preferable,但最简单的,或许最快的选择是使用一维数组在C。

There is a number of choices with C++, if you really like boost or stl then the answers below might be preferable, but the simplest and probably fastest choice is to use a single dimensional array as in C.

另一个可行的选择C和C ++,如果你想在[] []语法lillq的回答倒在底部手动构建有很多的malloc的数组。

Another viable choice in C and C++ if you want the [][] syntax is lillq's answer down at the bottom is manually building the array with lots of malloc's.

推荐答案

使用 boost::multi_array.

Use boost::multi_array.

作为你的榜样,你需要在编译时知道的唯一的事情就是维数。这里是文档中的第一个例子:

As in your example, the only thing you need to know at compile time is the number of dimensions. Here is the first example in the documentation :

#include "boost/multi_array.hpp"
#include <cassert>

int
main () {
  // Create a 3D array that is 3 x 4 x 2
  typedef boost::multi_array<double, 3> array_type;
  typedef array_type::index index;
  array_type A(boost::extents[3][4][2]);

  // Assign values to the elements
  int values = 0;
  for(index i = 0; i != 3; ++i)
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        A[i][j][k] = values++;

  // Verify values
  int verify = 0;
  for(index i = 0; i != 3; ++i)
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        assert(A[i][j][k] == verify++);

  return 0;
}

编辑:正如评论所说,这里的应用程序,让在运行时定义多维数组大小,从控制台输入要求。
下面是这个示例应用程序的输出示例(编译恒说这是3维):

As suggested in the comments, here is a "simple" example application that let you define the multi-dimensional array size at runtime, asking from the console input.Here is an example output of this example application (compiled with the constant saying it's 3 dimensions) :

Multi-Array test!
Please enter the size of the dimension 0 : 4

Please enter the size of the dimension 1 : 6

Please enter the size of the dimension 2 : 2

Text matrix with 3 dimensions of size (4,6,2) have been created.

Ready!
Type 'help' for the command list.

>read 0.0.0
Text at (0,0,0) :
  ""

>write 0.0.0 "This is a nice test!"
Text "This is a nice test!" written at position (0,0,0)

>read 0.0.0
Text at (0,0,0) :
  "This is a nice test!"

>write 0,0,1 "What a nice day!"
Text "What a nice day!" written at position (0,0,1)

>read 0.0.0
Text at (0,0,0) :
  "This is a nice test!"

>read 0.0.1
Text at (0,0,1) :
  "What a nice day!"

>write 3,5,1 "This is the last text!"
Text "This is the last text!" written at position (3,5,1)

>read 3,5,1
Text at (3,5,1) :
  "This is the last text!"

>exit

在code中的重要部分,我们从用户那里得到的尺寸和创建阵列的主要功能:

The important parts in the code are the main function where we get the dimensions from the user and create the array with :

const unsigned int DIMENSION_COUNT = 3; // dimension count for this test application, change it at will :)

// here is the type of the multi-dimensional (DIMENSION_COUNT dimensions here) array we want to use
// for this example, it own texts
typedef boost::multi_array< std::string , DIMENSION_COUNT > TextMatrix;

// this provide size/index based position for a TextMatrix entry.
typedef std::tr1::array<TextMatrix::index, DIMENSION_COUNT> Position; // note that it can be a boost::array or a simple array

/*  This function will allow the user to manipulate the created array
    by managing it's commands.
    Returns true if the exit command have been called.
*/
bool process_command( const std::string& entry, TextMatrix& text_matrix );

/* Print the position values in the standard output. */
void display_position( const Position& position );

int main()
{
    std::cout << "Multi-Array test!" << std::endl;

    // get the dimension informations from the user
    Position dimensions; // this array will hold the size of each dimension

    for( int dimension_idx = 0; dimension_idx < DIMENSION_COUNT; ++dimension_idx )
    {
    	std::cout << "Please enter the size of the dimension "<< dimension_idx <<" : ";
    	// note that here we should check the type of the entry, but it's a simple example so lets assume we take good numbers
    	std::cin >> dimensions[dimension_idx];
    	std::cout << std::endl;

    }

    // now create the multi-dimensional array with the previously collected informations
    TextMatrix text_matrix( dimensions );

    std::cout << "Text matrix with " << DIMENSION_COUNT << " dimensions of size ";
    display_position( dimensions );
    std::cout << " have been created."<< std::endl;
    std::cout << std::endl;
    std::cout << "Ready!" << std::endl;
    std::cout << "Type 'help' for the command list." << std::endl;
    std::cin.sync();


    // we can now play with it as long as we want
    bool wants_to_exit = false;
    while( !wants_to_exit )
    {
    	std::cout << std::endl << ">" ;
    	std::tr1::array< char, 256 > entry_buffer;
    	std::cin.getline(entry_buffer.data(), entry_buffer.size());

    	const std::string entry( entry_buffer.data() );
    	wants_to_exit = process_command( entry, text_matrix );
    }

    return 0;
}

你可以看到,在数组中加入一个元素,它真的很简单:你只需要使用操作符(),如以下功能:

And you can see that to accede an element in the array, it's really easy : you just use the operator() as in the following functions :

void write_in_text_matrix( TextMatrix& text_matrix, const Position& position, const std::string& text )
{
    text_matrix( position ) = text;
    std::cout << "Text \"" << text << "\" written at position ";
    display_position( position );
    std::cout << std::endl;
}

void read_from_text_matrix( const TextMatrix& text_matrix, const Position& position )
{
    const std::string& text = text_matrix( position );
    std::cout << "Text at ";
    display_position(position);
    std::cout << " : "<< std::endl;
    std::cout << "  \"" << text << "\"" << std::endl;
}

注:我编译VC9 + SP1这个应用程序 - 有只是一些不起眼的警告

Note : I compiled this application in VC9 + SP1 - got just some forgettable warnings.

这篇关于我如何最好地处理在C / C ++动态多维数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-12 02:45