我需要一个用'*'替换所有连续字符的函数。
我有这个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
我已经厌倦了细分错误,所以请帮帮我!
答案 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;
}