0

我正忙于一个动态二维数组,我已将其声明如下:

string** MakeArray(int row,int col)
{
    string** array;
    array = new string* [col];

    for(int r = 0; r < row; r++)
    {
        array[r] = new string [col];
    }
    return array;
}

现在我可以将字符串值放入数组中。如果我的数组是 4 x 99,如何将整数值放在第一列,将字符串放在第二列,将整数放在第三列?

4

4 回答 4

3

数组中的元素都是相同的类型。为了得到你所追求的,你可能想从一个不同的开始,使用一个结构数组:

struct whatever { 
    int a;
    std::string b;
    int c;
};

std::vector<whatever> your_array;

编辑:虽然这几乎可以肯定是一个糟糕的想法,但如果你真的需要它是一个二维数组,你可以尝试让你的所有元素成为相同类型的联合:

union whatever { 
    int a;
    std::string b;
};

不过,这有一些非常严重的限制——事实上,将 astd::string放入联合中根本没有得到官方支持。它很有可能会起作用,但根本不能保证。如果你真的,真的需要做这样的事情,你可以让联合的成员成为一个指针。这保证有效,但也保证如此笨拙以至于犯错几乎是不可避免的。

于 2012-07-29T14:02:38.567 回答
2

不要那样做。而是创建一个结构来表示表中的单个记录,并包含一个字符串和两个整数。然后创建这些结构的一维数组。

struct record
{
    int a;
    std::string b;
    int c;
};

record* MakeArray(int row)
{
    return new record[row];
}

更好的是,抛弃数组并使用 std::vector:

std::vector<record> array(99); 
于 2012-07-29T14:03:16.217 回答
1

如果您有可用的 C++11,您是否看过元组的向量/数组?因此,您可以执行以下操作:

#include <tuple>
#include <vector>

typedef std::tuple<int, std::string, int> MyTuple;

std::vector<MyTuple> MakeVector()
{
    std::vector<MyTuple> vecTuples;

     for( int i = 0; i < 5; ++i )
     {
         vecTuples.emplace_back( std::make_tuple<int, std::string, int>( i, "Test"+i, i+5 ) );
     }

     return vecTuples;
}
于 2012-07-29T14:07:48.753 回答
0

C++ 是一种“强类型”语言。这意味着您不能混合数据类型(除非它们是相关的,例如基派生类层次关系)。

换句话说,您所做的不是 C++ 直接支持的。

话虽如此,您可以做一些事情来做您想做的事情-拥有一系列三元组,如下所示:

struct triplet
{
  int first;
  string second;
  int third;
};

triplet** MakeArray(...

不过,您在示例中所做的看起来很像 JS 代码。也许您想要的是将所有数据存储为字符串?那么是的,您可以使用二维字符串数组,但这需要您在存储数据时将数据转换为字符串并从字符串转换回来进行计算。这是一个主要的性能问题

于 2012-07-29T14:01:22.097 回答