2016-11-15 10 views
-1

Я пытаюсь обрезать белые пространства от начала и конца строк на моей карте.Почему мои значения std :: map не изменены?

код не удается 3 тестов:

#include <map> 
#include <string> 

void blanksOut(std::map<int, std::string> & data) 
{ 
    for (auto p : data) { 
     std::string p1 = p.second; 

     size_t first = p1.find_first_not_of(' '); 
     p1 = p1.erase(0, first); 
     size_t last = p1.find_last_not_of(' '); 
     p1.resize(last + 1); 
     p.second = p1; 
    } 
} 

int main() 
{ 
    std::map<int, std::string> m; 
    m[2] = "foo"; 
    m[3] = " bar"; 
    m[5] = " baz "; 
    m[8] = "quux "; 

    blanksOut(m); 

    return(m[2] != "foo") 
     + (m[3] != "bar") 
     + (m[5] != "baz") 
     + (m[8] != "quux"); 
} 

только один, который проходит первый один, где не требуется никаких изменений. Что я делаю не так?

+0

Пожалуйста, отредактируйте ваш вопрос, чтобы предоставить [mcve] и * clear problem statement *. –

+0

Я ошибочно ответил, что 'string p1 = p.second;' должно быть 'string & p1 = p.second;' потому что я не смог увидеть инструкцию 'p.second = p1;'. Однако использование ссылки по-прежнему представляется более подходящим (но не решением проблемы) – stefaanv

+1

* Обрезка пробелов на строках на карте * - Что убеждает вас в том, что код работает, если вы не использовали карту? Почему бы не написать простую функцию, которая берет строку и удаляет конечное и конечное пустое пространство и забывает о картах на данный момент? – PaulMcKenzie

ответ

1

Ваша проблема заключается в том, что вы работаете на временной std::pair:

for (auto p : data) 

так, когда вы назначаете p.second, вы ничего не в std::map меняется. Вместо этого вы должны перебирать ссылки:

for (auto& p: data) 

Выполнение этого изменения заставляет проходить тесты.

+0

благодарит за вашу помощь! –