【问题标题】:Replace data in 2D vector C++替换二维向量 C++ 中的数据
【发布时间】:2015-02-22 23:41:49
【问题描述】:

我正在尝试在 2D 向量中搜索字符,即“?”并将其替换为“x”。

我在使用单个矢量执行此任务时没有问题,但在使用 2D 矢量实现时一直遇到问题,请参阅下面的代码。

#include <iostream>
#include <vector>
using namespace std;


int main()
{
        // An empty vector of vectors
        vector<vector<char> > v2d;

        // Create a vector with 5 elements
        vector<char> v2(5, '?');

        // Create a vector of 3 elements. 
        vector<vector<char> > v2d2(3, v2);

        // Print out the elements
        cout << "Before Vector Update" << endl;
        for (int i = 0; i < v2d2.size(); i++) {
            for (int j = 0; j < v2d2[i].size(); j++)
                cout << v2d2[i][j] << " ";
            cout << endl;
        }
        cout << "" << endl;

        /* Does not work as expected
        cout << "Vector Update" << endl;
        for (int i = 0; i < v2d2.size(); i++) {
            for (int j = 0; j < v2d2[i].size(); j++)
            {
                if (v2d[i] == '?');
                (v2d[i] = 'x');
            }
        }
        */

        cout << "" << endl;
        cout << "After Vector Update" << endl;
        for (int i = 0; i < v2d2.size(); i++) {
            for (int j = 0; j < v2d2[i].size(); j++)
                cout << v2d2[i][j] << " ";
            cout << endl;
        }

system("pause > NULL");
return 0;
}

我在尝试编译代码时收到以下错误消息。

IntelliSense: no operator "==" 匹配这些操作数操作数类型是:std::vector>, std::allocator>>> == char Project3\Source.cpp 77 16 Project3

我认为更新正确的行和列时容器存在问题。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 当然if(v2d[i] == '?')不行——想想看,v2d[i]是什么?

标签: c++ c++11 vector stl


【解决方案1】:

有一些错误,请与您的原始代码比较:

#include <iostream>
#include <vector>
using namespace std;


int main()
{
  // An empty vector of vectors
  vector<vector<char> > v2d;

  // Create a vector with 5 elements
  vector<char> v2(5, '?');

  // Create a vector of 3 elements. 
  vector<vector<char> > v2d2(3, v2);

  // Print out the elements
  cout << "Before Vector Update" << endl;
  for (int i = 0; i < v2d2.size(); i++) {
    for (int j = 0; j < v2d2[i].size(); j++)
      cout << v2d2[i][j] << " ";
    cout << endl;
  }

  for (int i = 0; i < v2d2.size(); i++) {
    for (int j = 0; j < v2d2[i].size(); j++)
      if (v2d2[i][j] == '?')
        v2d2[i][j] = 'x';
  }

  cout << "After Vector Update" << endl;
  for (int i = 0; i < v2d2.size(); i++) {
    for (int j = 0; j < v2d2[i].size(); j++)
      std::cout << v2d2[i][j] << " ";
    cout << endl;
  }


  return 0;
}

【讨论】:

  • 谢谢你,Marcin,我知道我调用了错误的向量名称。
  • 好:for (int i = 0; i
  • 不好,v2: if (v2d[i][j] == '?') v2d[i][j] = 'x';
【解决方案2】:

看看你的注释代码:

cout << "Vector Update" << endl;
for (int i = 0; i < v2d2.size(); i++) {
    for (int j = 0; j < v2d2[i].size(); j++)
    {
        if (v2d[i] == '?'); // <------
        (v2d[i] = 'x');
    }
}

if 语句后有一个分号,表示如果该语句为真,则不会执行任何操作。菜鸟失误。

许多人认为bad practice 不总是在if-statements 和其他需要它们的类似情况下使用括号,因为这样的问题

【讨论】:

    【解决方案3】:

    你应该有:

            if (v2d[i][j] == '?'){
                v2d[i][j] = 'x';
            }
    

    【讨论】:

    • 我现在看到我没有调用向量的列部分。
    【解决方案4】:
        cout << "Vector Update" << endl;
        for (int i = 0; i < v2d2.size(); i++) {
            for (int j = 0; j < v2d2[i].size(); j++)
            {
                if (v2d[i][j] == '?')
                    v2d[i][j] = 'x';
            }
        }
    

    您没有正确访问二维向量,应该使用 v2d[i][j] 代替。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2021-01-31
      • 2021-10-02
      相关资源
      最近更新 更多