Как мне найти и заменить символы внутри 2-го вектора символов? C ++ - PullRequest
0 голосов
/ 09 ноября 2018

Допустим, у меня есть двумерный массив символов, который выглядит следующим образом:

ooooooooo
ooooooooo
ooooooooo
ooooxoooo
ooooooooo
ooooooooo
ooooooooo

Допустим, я хочу заменить все o на «я», чтобы это выглядело так:

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

Ps. Извините, если это простое решение, я новичок в c ++, и я посмотрел, как другие люди это делали, но у них всегда был вектор Strings вместо char.

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018
void replace(vector<vector<char>> &vec, char oldd, char neww) {
    for(auto v : vec)
    {
        for(auto c : v) 
         if (c == oldd) {
            c = neww;
         }
    }
}

Вот, пожалуйста.C ++ позволяет вам использовать auto в цикле foreach и т. Д., И это супер аккуратно.

0 голосов
/ 09 ноября 2018

Обратите внимание на критическую разницу между = и ==. Выражение c == oldd является тестом на равенство . То есть он возвращает true, если c и oldd имеют одинаковое значение, а 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
        }
    }
}

Надеюсь, это поможет! Счастливое кодирование

0 голосов
/ 09 ноября 2018

Ваш внешний цикл должен принимать ссылку на внутренний вектор.Без ссылки внутренний цикл изменяет только копию вектора.Одно из предложений: используйте стандартный библиотечный алгоритм вместо цикла для изменения значений.

#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
    }
}
0 голосов
/ 09 ноября 2018

Ты супер близко! У вас есть только две ошибки.

  1. Это довольно глупо, но похоже, что вы случайно добавили знак дополнительного равенства в назначении нового персонажа. Измените c == neww; (который сравнивает их и ничего не делает) на c = neww;.
  2. Это немного более нюансированный, но вам нужно изменить свои циклы, чтобы использовать ссылочные переменные. Прямо сейчас, когда вы зацикливаетесь, вы имеете дело с копией каждой строки, а c является копией каждого значения в каждой скопированной строке. Это так же просто, как добавить два & в ваши циклы.

Когда все сказано, что сделано, и вы исправляете свои отступы и привязываете форматирование к фигурным скобкам на той же или следующей строке, все должно выглядеть следующим образом:

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

...