2014-02-26 32 views
2

我需要一個函數來用'*'替換所有連續字符。 我有這個2D矢量(vector<vector<string> > two_dimensional(row, vector <string>(col)):查找2D矢量中的連續字符

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 

我厭倦了分段錯誤的錯誤,請幫助我!

+1

爲什麼你有vector的vector?爲什麼不只是一個'std :: vector '? – 2014-02-26 21:02:35

+0

_'I'm厭倦了分段錯誤的錯誤,請幫助我!'_請問哪些具體的?顯示您嘗試過的代碼。 –

+0

@remyabel:正如我所說這是一個兩維矢量。 – mhm

回答

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

從你的例子的外觀看起來你打算在水平和垂直軸更換相鄰值。這是爲什麼最後一行'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; 
}