是否可以在C ++中将可变长度数组作为参数传递?

时间:2019-04-25 21:16:38

标签: c++

我之前不知道V的值。在我在程序中打开的文件中找到该文件。不能这样定义#DEFINE V __。它不能用作全局变量。输入文件根据内容更改V。期望参数通过并使用Geeks for Geeks上的djisktra算法。

我尝试了全局声明V,但是遇到一个错误,说“变量必须具有恒定值。”

void dijkstra(int graph[V][V], int src, int V)
//array function being pasted, error is the V in graph[V]
//V is defined at beginning of main as 
int V;
//where V is changed
while(std::getline(file2,newstr))
{
    if(newstr.find(check) != std::string::npos)
    {
        V++;
    }
}
//where it is passed in main
for(int i = 0; i < V; i++)
{
    size = V;
    dijkstra(array[size][size], i, V);        
}

3 个答案:

答案 0 :(得分:2)

不要使用C样式的数组。使用std::vector和标准库中的朋友,如果您想知道它们的大小,可以询问他们。

已转换:

void dijkstra(const std::vector<std::vector<int>>& graph, int src) {
  auto v = graph.size();

  // ... Other code.
}

要插入,您可以使用push_back

std::vector<std::vector<int>> graph;

while(std::getline(file2,newstr)) {
  if(newstr.find(check) != std::string::npos) {
    std::vector<int> row;

    row.push_back(...);

    graph.push_back(row);
  }
}

然后像常规变量一样传递它:

dijkstra(graph, src);

如果所有这些矢量东西看起来都很丑陋,请typedef看起来更友好。

答案 1 :(得分:1)

对于c样式数组,您需要在编译时知道大小。像int N;这样的变量是运行时值。像constexpr int N = 9;这样的变量在编译时就可用,并且不能被突变。

如果需要在运行时可调整大小的数组,则需要某种动态数组。最常见的是std::vector

void dijkstra(std::vector<int> graph, int src, int V)
std::vector<int> graph;
graph.resize(V * V); // vector are resizable

for(int i = 0; i < V; i++)
{
    size = V;
    dijkstra(graph, i, V);        
}

答案 2 :(得分:0)

  

是否可以在C ++中将可变长度数组作为参数传递。

不。

std C ++不支持可变长度数组,但是请继续阅读,它们具有更好的替代选择。


  

在打开的文件中找不到V之前,我不知道它的值   在程序中。

一个简单的一维向量很容易创建, 在您的代码找到V之后,不需要编译时间常数。

在我的其中一个程序的早期启动中,使用argv [3]和argv [4]构建了gBoard向量。这是一个片段:

  aTermPFN               += argv[1];    // ouput tty, /dev/pts/<argv[1]>
  fillPatternChoiceLetter = argv[2][0];
  aMaxRow                 = stoi(argv[3]);
  aMaxCol                 = stoi(argv[4]);
  userDim                 = true;

很显然,该程序已经启动...并且可以通过(aMaxRow * aMaxCol)轻松计算V大小。

我发现很容易按行主要顺序访问1d向量(或1d数组),就好像它是2d矩阵一样,具有以下功能:

// game-board-index: computes index into the single dimension vector
//                   from 2d (row, col) matrix coordinates
size_t gbIndx(int r, int c) { return static_cast<size_t>((r * maxCol) + c); }

// a 2d game board of cells

// 2d access (row major order) implemented using 1d access
Cell_t*  getCell( int r, int c )   { return (gBoard [gbIndx(r,c)]); } 

// 1d access is surprisingly convenient for many functions
Cell_t*  getCell( uint gbIndex  )  { return (gBoard [gbIndex]);     } 

示例初始化用法:

//              vvvvvvvvvvvvvvvvvvv_-- 2d matrix access
gBoard [ gbIndx((midRow+1), midCol)   ] -> setOptionX();
//       ^^^^^^--1d row-major order index 

随机化的gGoard在1天之内微不足道:

无效GOLUtil_t :: setRandom() {    CellVec_t myVec(gBoard); //复制单元格向量

random_device rd;    mt19937_64 gen(rd());    随机播放(myVec.begin(),myVec.end(),gen); //随机排序

int count = 1;    for(auto it:myVec)//随机标记一半的单元格    {       if(count ++&1)          it-> setAlive(); //每个奇数单元格    } }


来自https://en.cppreference.com/w/cpp/container/vector的注释:

“元素是连续存储的,这意味着不仅可以通过迭代器访问元素,还可以使用指向元素的常规指针的偏移量来访问。这意味着可以将指向向量元素的指针传递给任何需要一个指向数组元素的指针。”


我很惊讶1d访问启用简化代码的频率。

for (auto it : gBoard)
   it->init();        // command each cell to init

摘要:

尽管std C ++不支持可变长度数组(vla),但我相信您会发现std :: vector是更好的选择。您会发现在代码内传递向量是可行的。