[英]Problem with initialising 2D vector in C++
我正在为这个问题实施一个解决方案,以了解该语言。 我的推理如下:
请注意,对角线上的图案是2*n+1
。
左边和上面的元素是从对角线到边界的元素的交替等差数列或加法/减法。
创建一个二维向量并实例化所有对角线元素。 然后创建一个虚拟变量以通过添加/减去对角线元素来填充剩余部分。
我的代码如下:
#include <vector>
using namespace std;
const long value = 1e9;
vector<vector<long>> spiral(value, vector<long> (value));
long temp;
void build(){
spiral[0][0] = 1;
for(int i = 1; i < 5e8; i++){
spiral[i][i]= 2*i+1;
temp = i;
long counter = temp;
while(counter){
if(temp % 2 ==0){
spiral[i][counter]++;
spiral[counter][i]--;
counter--;
temp--;
}else{
spiral[i][counter]--;
spiral[counter][i]++;
counter--;
temp--;
}
}
}
}
int main(){
spiral[0][0] = 1;
build();
int y, x;
cin >> y >> x;
cout << spiral[y][x] << endl;
}
问题是程序不输出任何东西。 我不明白为什么我的向量不会打印任何元素。 我已经用spiral[1][1]
对其进行了测试,等待 5 或 10 分钟后,我得到的只是一些晦涩的汇编消息。 我的推理有什么问题?
编辑:完整输出是:
和
对于您来说, long
可能是 4 或 8 个字节(例如,通常在 Windows 上为 4 个字节,在 x86 Linux 上为 4 个字节,在 x64 Linux 上为 8 个字节),因此让我们假设 4. 1e9 * 4
是每个vector<long> (value)
4 GB 连续内存vector<long> (value)
。
然后外部向量创建另一个1e9
副本,这是 4 1e9
字节(或 400 1e9
兆字节),给定 32 位长或 64 位双倍,并忽略每个std::vector
的开销大小。 您不太可能拥有那么多内存和交换文件,并且在调用 main() 之前尝试将其设为全局。
因此,您将无法直接存储所有这些数据,您需要考虑实际需要存储哪些数据才能获得所需的结果。
如果您在设置为停止异常的调试器下运行,您可能会看到std::bad_alloc
被抛出,调用堆栈指示原因(例如,Visual Studio 将在调用堆栈中显示类似“'spiral'的动态初始化程序”的内容),但在 Linux 上操作系统可能会先杀死它,因为 Linux 可能会过度使用内存(所以new
等成功),然后当某个程序开始使用内存(实际读取或写入)时,它会失败(超过提交,没有什么免费的)并且它 SIGKILL 是释放内存的东西(这似乎并不完全可以预测,我将您的代码复制粘贴到 Ubuntu 18 上,并且在命令行上“在抛出一个‘std::bad_alloc’实例后被终止调用” )。
在这里,数学是你的朋友,而不是std::vector
。 这个谜题的一个限制是 512MB 的内存限制,但是一个足够大的向量进行所有测试需要几 GB 的内存。
考虑如何填充正方形。 如果您选择给定x
和y
之间的最大值(称为w
),您就“分隔”了一个大小为 w 2的正方形。 现在您必须考虑这个正方形的外边缘才能找到实际的索引。
例如,取 x = 6 和 y = 3。最大值是 6(偶数,记住锯齿形图案),所以数字是 (6 - 1) 2 + 3 = 28
* * * * * 26 * * * * * 27 * * * * * [28] * * * * * 29 * * * * * 30 36 35 34 33 32 31
在这里,一个概念证明。
该问题实际上要求您找到解决方案的分析公式,而不是模拟模式。 您需要做的就是仔细分析模式:
unsigned int get_n(unsigned int row, unsigned int col) {
assert(row >= 1 && col >= 1);
const auto n = std::max(row, col);
if (n % 2 == 0)
std::swap(row, col);
if (col == n)
return n * n + 1 - row;
else
return (n - 1) * (n - 1) + col;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.