【问题标题】:How to use copy_if in a vector of vector of char - C++如何在 char 向量的向量中使用 copy_if - C++
【发布时间】:2020-10-11 20:56:39
【问题描述】:

我有一个vector<vector<char>>,我正在尝试使用copy_if。此函数需要一个开始和结束迭代器。我知道如何在矢量上使用它。但我不知道如何在vector<vector<char>> 上使用它。

我有一个 5 x 5 vector<vector<char>>

'a' 'a' 'x' 'x' 'b'
'a' 'x' 'c' 'c' 'd'
'd' 'd' 'd' 'x' 'b'
'a' 'a' 'x' 'x' 'b'
'a' 'a' 'x' 'x' 'b'

我正在尝试将所有不是“x”的字符复制到新的vector<vector<char>> 中。所以它应该看起来像

'a' ' ' ' ' ' ' 'b'
'a' 'a' ' ' ' ' 'd'
'd' 'd' ' ' ' ' 'b'
'a' 'a' 'c' ' ' 'b'
'a' 'a' 'd' 'c' 'b'

其他角色垂直下落

这是我尝试过的:

vector<vector<char>>::iterator row;
vector<char>::iterator col
int i = -1;

for(row = board.begin(); row != board.end(); ++row)
{
    boardCopy.push_back(vector<char>());
    ++i;

    for(col = row->begin(); col != row->end(); ++col)
    {
         copy_if(row->begin(); row->end(), boardCopy[i].begin(), [](char x){return (c != 'x');});
    }
}

【问题讨论】:

  • 我不认为 std::copy_if 是正确的工具,因为您希望保持相同的相对位置。
  • 有人可能会为您想出一个优雅的解决方案,但您也可能会认为您可能使用了错误的工具来完成这项工作。我只需复制整个向量,去掉x 字符,然后将它们压缩。如果您实际上不需要矢量的副本,则可以直接剥离/压缩。
  • 重要提示:你真正想要的是一个 25 元素的 vector&lt;char&gt;。仅仅因为它在屏幕上看起来像一个正方形并不意味着您需要所有的嵌套和多余的分配......只需在每 5 个元素后写一个换行符;)
  • 看来您需要按列而不是按行。只需在纸上画出步骤,然后对其进行编程。 (copy_if 在这种情况下无法使用,最好“手动”复制)。

标签: c++ algorithm vector copy


【解决方案1】:

在这种情况下使用copy_if 的问题是,即使c 是“x”,您仍然希望插入向量。 第二个问题是这不会将push_back 的元素放入向量中。它实际上会在向量结束后写入可能未初始化的内存。

您可以通过将std::back_inserter 用于输出迭代器来解决第二个问题,但您仍然需要不同的标准算法。但是,当简单的 for 循环更加清晰时,我认为这会使事情变得过于复杂:

    vector<vector<char>> table = { /* characters here */ };
    vector<vector<char>> new_table;

    for (vector<char> const& row : table)
    {
        auto& new_row = new_table.emplace_back();
        for (char c : row)
        {
            if (c != 'x') { new_row.push_back(c); }
        }
        new_row.resize(5, ' ');
    }

https://gcc.godbolt.org/z/Pcc84o

【讨论】:

  • 不错的尝试,但您仍然缺少 其他字符垂直下落 部分。
  • 确实如此。 OP的问题是他们使用“我试图将所有不是'x'的字符复制到新向量>”,但忘记了”并复制那些是 'x' 但给它们一个新值“ 部分。规范中的经典快捷方式;)
  • @AsteroidsWithWings,你的意思是,像俄罗斯方块;)
  • 哎呀,我错过了那部分:p。我只是让这更简单,并假设数组实际上是转置的。 OP 可以解决剩下的问题。
猜你喜欢
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2021-08-26
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多