【问题标题】:How to implement infinite multidimensional array?如何实现无限多维数组?
【发布时间】:2012-05-03 18:54:31
【问题描述】:

我想使用下面的代码,我想将它用于“未知大小的输入”。例如有一个数组int cac[1000][1000]。我可以使用vector<vector<int> > array;,那么如何使用-1 对其进行初始化?有什么建议吗?

#include <sstream>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <memory.h>

using namespace std;

int cac[1000][1000];
string res[1000][1000];
vector<string> words;
int M;

int go(int a, int b){
 if(cac[a][b]>= 0) return cac[a][b];
 if(a == b) return 0;

 int csum = -1;
 for(int i=a; i<b; ++i){
  csum += words[i].size() + 1;
 }
 if(csum <= M || a == b-1){
  string sep = "";
    for(int i=a; i<b; ++i){
        res[a][b].append(sep);
        res[a][b].append(words[i]);
        sep = " ";
    }
  return cac[a][b] = (M-csum)*(M-csum);
 }

 int ret = 1000000000;
 int best_sp = -1;
 for(int sp=a+1; sp<b; ++sp){
 int cur = go(a, sp) + go(sp,b);
 if(cur <= ret){
    ret = cur;
    best_sp = sp;
 }
 }
 res[a][b] = res[a][best_sp] + "\n" + res[best_sp][b];
 return cac[a][b] = ret;
 }


int main(int argc, char ** argv){
memset(cac, -1, sizeof(cac));
M = atoi(argv[1]);
string word;
while(cin >> word) words.push_back(word);
go(0, words.size());
cout << res[0][words.size()] << endl;
}

【问题讨论】:

  • 您希望-1 具有什么语义?
  • 我很困惑,你能不能更深入地解释一下你想要做什么?
  • 无限数组是链表。这就是你想要的。
  • std::map&lt;int, std::vector&lt;int&gt;&gt; 我认为这对你会更好。
  • @vk7x : if (cac[i].empty()) { /*not initialized*/ }...

标签: c++ arrays size


【解决方案1】:

您可以做的是使用关联数组,其中键是一对(rowPositionColumnPosition)。当您想设置array[i][j] 时,您只需添加或更新值assoArray[Pair(i,j)]。您可以假设任何不在关联数组中的元素都具有初始值。

通常无限多维数组用于理论目的。我希望我没有误解这个问题。

【讨论】:

    【解决方案2】:

    使用 STL 中的 std::vector 比下面的解决方案简单得多,这篇文章的 cmets 中已经指出了这一点。我发现这个网站有效地解释了这个话题:http://www.learncpp.com/cpp-programming/16-2-stl-containers-overview/

    无限大小的数组实际上是不可能的。但是,您可以使用动态分配基本上实现该效果。下面是一些示例代码:

    int counter = 0;
    int* myArray = new int[1000];
    

    用数据填充数组,每次添加值时递增计数器。当计数器达到 1000 时,执行以下操作:

    int* largerArray = new int[2000];
    for( int i = 0; i < 1000; i++ )
    {
        largerArray[i] = myArray[i];
    }
    delete[] myArray;
    myArray = largerArray;
    

    使用这种方法,您可以创建最接近无限大小的数组的东西,而且我认为副本不会成为性能问题

    【讨论】:

    • 我不认为这种错误值得我的帖子投反对票。不过你是对的,很好的建议
    • 我的反对票是鼓励您更改帖子的动力。一旦您这样做,它将被撤回。
    • 我没有意识到这是可能的。这很有趣,谢谢你的提示 XD。
    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多