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

我有一个 2D char 向量:

vector< vector<char> > matrix;

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

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

【问题讨论】:

标签: c++ vector resize


【解决方案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;

【讨论】:

【解决方案3】:

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

assert(COL >= 0);
assert(ROW >= 0);
vector<vector<char>> matrix;
for (size_t i{0}; i != COL; ++i)
{
    matrix.emplace_back(ROW);
}

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多