【问题标题】:How would I find and replace chars inside a 2d vector of chars? c++如何在 2d 字符向量中查找和替换字符? C++
【发布时间】:2019-04-12 11:27:46
【问题描述】:

假设我有一个二维字符数组,看起来像:

ooooooooo
ooooooooo
ooooooooo
ooooxoooo
ooooooooo
ooooooooo
ooooooooo

假设我想将所有的 o 替换为 I,所以它看起来像这样:

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;
         }
    }
}

附言。抱歉,如果这是一个简单的解决方案,我是 c++ 新手,我查找了其他人的做法,但他们总是有一个字符串向量而不是字符向量。

【问题讨论】:

    标签: c++ vector char


    【解决方案1】:

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

    #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
        }
    }
    

    【讨论】:

    • 谢谢,使用库让事情变得简单多了!谢谢!
    【解决方案2】:

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

    此外,在你的 for 循环中,如果你想进行持久的更改,你应该通过引用遍历元素。

    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 */ }
    

    试试这个修复:

    for(vector<char>& v : vec){
        for(char& c : v){
            if (c == oldd) { // only enter the clause if c and old are equal
                // c == neww; <- this does nothing, it returns a boolean value that never gets used
                c = neww; // <- this assigns the new value
            }
        }
    }
    

    希望对您有所帮助!快乐编码

    【讨论】:

      【解决方案3】:

      你非常接近!你只有两个错误。

      1. 这很傻,但看起来你不小心在新字符的分配中添加了一个额外的等号。将c == neww;(比较它们并且什么都不做)更改为c = neww;
      2. 这有点微妙,但您需要更改循环以使用引用变量。现在,当您循环时,您正在处理每一行的副本,c 是每个复制行中每个值的副本。这就像在循环中添加两个 &amp; 一样简单。

      当一切都说完了,你修正了缩进并让你的格式坚持在同一行或下一行的大括号上,事情应该是这样的:

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

      在这里查看它的工作原理:ideone

      【讨论】:

      • 感谢您的友好回复。我意识到我用 = 运算符做了什么。
      【解决方案4】:
      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,它非常简洁。

      【讨论】:

      • 您的 for 循环不太正确。您需要对影响容器的更改进行非常量引用。
      • 在两个循环中都需要 referencesfor (auto &amp;v : vec)for (auto &amp;c : v)
      猜你喜欢
      • 2015-07-17
      • 1970-01-01
      • 2021-10-03
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 2020-08-12
      相关资源
      最近更新 更多