首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在读取数组的大小后声明它吗?

我应该在读取数组的大小后声明它吗?
EN

Stack Overflow用户
提问于 2017-08-12 13:02:36
回答 3查看 103关注 0票数 1
代码语言:javascript
复制
int h, w;
cin>>h>>w;

int a[h + 1][w + 1], f[h + 1][w + 1];

我是否应该使用这种类型的声明来降低空间复杂性,而不是在获取实际请求的大小之前声明数组?

EN

回答 3

Stack Overflow用户

发布于 2017-08-12 13:06:19

这些都是一些编译器支持的非标准扩展。不要指望他们。最好使用std::vector

代码语言:javascript
复制
int h, w;
cin >> h >> w;

std::vector<std::vector<int>> a{h + 1, std::vector<int>{w + 1}};
std::vector<std::vector<int>> f{h + 1, std::vector<int>{w + 1}};
票数 6
EN

Stack Overflow用户

发布于 2017-08-12 13:45:53

c99中允许使用Variable-length automatic arrays,但c++中不允许。作为一个扩展,GCC接受它们,但是如果你用-std=c++14-pedantic构建以下示例,你会得到警告:

代码语言:javascript
复制
void foo(int n) {
    int bar[n];
}

警告: ISO C++禁止可变长度数组‘’-Wvla

我不推荐使用它,c++有自己的动态数组类型,称为std::vector

另一个answer展示了一个很好的示例,它使用值为std::vector<int>(w + 1)的元素的h + 1副本来构造std::vector,这是另一个带有std::vectorw + 1 default-inserted实例的int

票数 5
EN

Stack Overflow用户

发布于 2017-08-12 19:10:38

现代C++不允许在运行时确定数组的大小。正如其他答案所指定的那样,c99允许这样做。最好的方法是使用向量。

例如,尝试在Microsoft Visual Studio中编译此代码,看看会发生什么。

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
    int size;
    cin >> size;
    int arr[size]; // 8th line
}

错误:

代码语言:javascript
复制
source_file.cpp(8): error C2131: expression did not evaluate to a constant
source_file.cpp(8): note: failure was caused by non-constant arguments or reference to a non-constant symbol
source_file.cpp(8): note: see usage of 'num'
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

你应该使用的是向量。向量做的是,它决定了运行时的大小。你可以把更多的元素放进去,它会变得更大。你可以随时随地删除更多的元素,然后它的大小就会变小。

但是要小心,不要把容量和大小混为一谈。下面是一个示例代码,让您了解容量是如何工作的。

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    cout << "Adding elements!" << endl;
    for(int i = 0; i < 10; i++)
    {
        v.push_back(6);
        cout << "Capacity: " << v.capacity() << endl;
    }

    cout << "Removing elements!" << endl;
    for(int i = 0; i < 10; i++)
    {
        v.pop_back();
        cout << "Capacity: " << v.capacity() << endl;
    }
}

Linux x64输出:

代码语言:javascript
复制
Adding elements!
Capacity: 1
Capacity: 2
Capacity: 4
Capacity: 4
Capacity: 8
Capacity: 8
Capacity: 8
Capacity: 8
Capacity: 16
Capacity: 16
Removing elements!
Capacity: 16
Capacity: 16
Capacity: 16
Capacity: 16
Capacity: 16
Capacity: 16
Capacity: 16
Capacity: 16
Capacity: 16
Capacity: 16

即使我稍后删除这些元素,容量仍将保持其最后一个值。

Capacity返回当前为向量分配的存储空间的大小,以元素表示。

Size返回向量中元素的数量。

祝你玩得开心,祝你好运!

编辑:还可以根据操作系统的不同更改容量。

微软x64输出:

代码语言:javascript
复制
Adding elements!
Capacity: 1
Capacity: 2
Capacity: 3
Capacity: 4
Capacity: 6
Capacity: 6
Capacity: 9
Capacity: 9
Capacity: 9
Capacity: 13
Removing elements!
Capacity: 13
Capacity: 13
Capacity: 13
Capacity: 13
Capacity: 13
Capacity: 13
Capacity: 13
Capacity: 13
Capacity: 13
Capacity: 13
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45646689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档