如何在chars的2d向量中查找和替换chars? C ++

时间:2018-11-08 21:33:59

标签: c++ vector char

让我们说我有一个二维字符数组,看起来像:

ooooooooo
ooooooooo
ooooooooo
ooooxoooo
ooooooooo
ooooooooo
ooooooooo

让我说我想替换所有的o改为我,所以它看起来像这样:

IIIIIIIII
IIIIIIIII
IIIIIIIII
IIIIxIIII
IIIIIIIII
IIIIIIIII
IIIIIIIII

当前从用户获取输入的方式是使用命令行:

int main(int argc, char* argv[]) {

这是我到目前为止提出的:

void replacee(vector<vector<char>> &vec, char oldd, char neww) {
    for(vector<char> v:vec)
    // change
    {
        for(char c:v) 
         if (c == oldd) {
            c == neww;
         }
    }
}

Ps。抱歉,如果这是一个简单的解决方案,那是c ++的新手,并且ive查找了其他人执行此操作的方式,但他们始终使用String的向量而不是char的向量。

4 个答案:

答案 0 :(得分:3)

您的外部循环需要对内部向量进行引用。如果没有引用,则内部循环仅修改向量的副本。一个建议是,使用标准库算法而不是循环来修改值。

#include <algorithm>

void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
    for (vector<char> &v : vec) // reference to innver vector
    {
        replace(v.begin(), v.end(), oldd, neww); // standard library algorithm
    }
}

答案 1 :(得分:2)

请注意===之间的关键区别。表达式c == oldd相等性测试。也就是说,如果truec具有相同的值,则返回oldd,否则返回false。另一方面,像c = neww这样的表达式是 assignment ,这意味着neww的值被复制到变量{{1 }}。

此外,在for循环中,如果要进行持久更改,则应按引用遍历元素

c

尝试此修复程序:

for(vector<char> v : vec){ /* v is a copy, changing it will leave no effect */ }

for(vector<char>& v : vec){ /* v is a reference, changes to it will be visible outside */ }

希望有帮助!编码愉快

答案 2 :(得分:1)

您超级亲密!您只有两个错误。

  1. 这很愚蠢,但看起来您不小心在新角色分配中加入了一个额外的等号。将20000(比较它们而不执行任何操作)更改为c == neww;
  2. 这有点细微差别,但是您需要更改循环以使用参考变量。现在,当您循环时,您正在处理每一行的副本,而c = neww;是每一行中每个值的副本。这就像在循环中添加两个c一样简单。

当一切都说完了,您修复了缩进并使格式停留在同一行或下一行的大括号时,事情应该像这样:

&

在此处查看其工作原理:ideone

答案 3 :(得分:1)

void replace(vector<vector<char>> &vec, char oldd, char neww) {
    for(auto v : vec)
    {
        for(auto c : v) 
         if (c == oldd) {
            c = neww;
         }
    }
}

您在这里。 C ++允许您在foreach循环等中使用auto,它非常简洁。