如何调整 2D C++ 向量的大小?

Posted

技术标签:

【中文标题】如何调整 2D C++ 向量的大小?【英文标题】:How can I resize a 2D C++ vector? 【发布时间】:2013-11-18 12:21:21 【问题描述】:

我有一个 2D char 向量:

vector< vector<char> > matrix;

我将读取一个矩阵作为输入并将其存储在该向量中。我的向量的大小是固定的,是 ROW x COL。我想我需要为每一行和每一列调整它的大小。

如何在不占用额外内存的情况下完成它(正确调整大小)?

【问题讨论】:

打电话resize有什么问题? 这能回答你的问题吗? How can I resize a 2D vector of objects given the width and height? 【参考方案1】:

鉴于向量为空,您可以使用预先分配的内部向量简单地调整外部向量的大小,而无需循环:

matrix.resize(COL, vector<char>(ROW));

或者,当初始化或者如果你想重置一个非空向量,你可以使用构造函数重载获取一个大小和初始值来初始化所有内部向量:

matrix = vector<vector<char> >(COL, vector<char>(ROW));

根据您的矩阵是列优先还是行优先,您需要交换参数ROWCOL。第一个(外部向量上的第一个参数)是您访问矩阵的第一个维度,即我假设您使用 matrix[col][row] 访问它。

【讨论】:

你是说你写的第一行代码还是第二行?因为我会用matrix[row][col]访问它 交换参数?它适用于两者。这两行都用新构建的内部向量实例初始化外部向量;最初都正确调整大小。您可以使用归零的列/行向量初始化外部向量。 我注意到如果列大于行,正确的代码应该是matrix.resize(row, vector&lt;char&gt;(col)); 否则会出现一些内存分配问题 你的意思是为了我的还是为了@leemes'? 这段代码的问题在于它不会调整内部向量的大小。它只调整外部向量的大小。【参考方案2】:
    const size_t ROW = 10;
    const size_t COL = 20;
    std::vector<std::vector<char>> v;

    v.resize( ROW );

    std::for_each( v.begin(), v.end(), 
                   std::bind2nd( std::mem_fun_ref( &std::vector<char>::resize ), COL ) );

    std::cout << "size = " << v.size() << std::endl;
    for ( const std::vector<char> &v1 : v ) std::cout << v1.size() << ' ';
    std::cout << std::endl;

【讨论】:

为什么这么复杂? v.resize将初始内容作为第二个参数。 另外,mem_fun_ref is deprecated。【参考方案3】:

虽然@leemes 给出的将大小向量作为默认值的构造是一个很好的答案,但还有一种替代方法,无需使用额外的向量和复制 ctor:

assert(COL >= 0);
assert(ROW >= 0);
vector<vector<char>> matrix;
for (size_t i0; i != COL; ++i)

    matrix.emplace_back(ROW);

【讨论】:

以上是关于如何调整 2D C++ 向量的大小?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 中的向量不会自动调整大小

C++ priority_queue 底层向量容器容量调整大小

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

类中的 2D 矢量调整大小。在此范围内未声明错误[关闭]

如何在 C++ 的主函数中为全局声明的 2d 向量分配大小?

Armadillo 与 Boost Odeint 冲突:Odeint 在积分期间将状态向量的大小调整为零