在2D矢量中查找连续字符

时间:2014-02-26 20:57:44

标签: c++ vector

我需要一个用'*'替换所有连续字符的函数。 我有这个2D矢量(vector<vector< string > > two_dimensional( row, vector < string >( col )):

r   g   o   g   b   

r   r   r   r   r   

g   r   r   b   o   

y   y   r   o   g

如何使函数比较例如vec [1] [2]与第1行和第2列的所有元素,并产生以下结果:

r   g   o   g   b   

*   *   *   *   *   

g   r   *   b   o   

y   y   *   o   g

我已经厌倦了细分错误,所以请帮帮我!

2 个答案:

答案 0 :(得分:1)

您可以按照以下内容编写内容(不进行测试)

typedef std::vector<std::vector<std::string>>::size_type size_type;
void replace( std::vector<std::vector<std::string>> &v, size_type row, size_type col )
{
   if ( v.size() <= row ) return;
   if ( v[row].size() <= col ) return;

   std::string value = v[row][col];

   for ( size_type i = 0; i < v.size(); i++ )
   {
      if ( col < v[i].size() && v[i][col] == value ) v[i][col] = "*";
   }


   for ( std::string &s : v[row] )
   {
      if ( s == value ) s = "*";
   }
}     

答案 1 :(得分:1)

从您的示例的外观来看,您似乎打算替换水平轴和垂直轴上的相邻值。这是为什么修改最后一行中的'r'值的唯一原因。但是,您的示例在输出中仍然存在错误。它看起来应该如下所示。

r g o g b 
* * * * * 
g * * b o 
y * * o g 

如果您打算检查x和y轴上的相邻值,则需要在给定点保留原始值,直到检查了两个轴。最简单的方法是将原始矩阵保持为只读,并创建一个新的修改矩阵。下面是一个可行的示例函数。 A working example of this can be found here

typedef std::vector<std::vector<char>> two_dimensional;

two_dimensional remove_adjacents(const two_dimensional& source)
{
    two_dimensional modified = source;
    const size_t rowSize = source.size();
    const size_t colSize = rowSize > 0 ? source[0].size() : 0;
    for(size_t row = 0; row < rowSize; ++row)
    {
        for(size_t col = 0; col < colSize; ++col)
        {
            if(row > 0 && source[row][col] == source[row-1][col])
                modified[row][col] = '*';
            if(col > 0 && source[row][col] == source[row][col-1])
                modified[row][col] = '*';
        }
    }
    return modified;
}