C++ std:: transform () i toupper ().dlaczego to się nie udaje?
Mam 2 std::string. Po prostu chcę, biorąc pod uwagę ciąg wejściowy:
- pisanie wielkimi literami
- Przypisz wielką literę do wyjściowego ciągu.
Jak to działa:
std::string s="hello";
std::string out;
std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);
Ale to nie (skutkuje awarią programu)?
std::string s="hello";
std::string out;
std::transform(s.begin(), s.end(), out.begin(), std::toupper);
Ponieważ to działa (przynajmniej na tym samym łańcuchu:
std::string s="hello";
std::string out;
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
3 answers
Nie ma spacji w out
. Algorytmy C++ nie rozwijają swoich docelowych kontenerów automatycznie. Musisz zrobić miejsce samodzielnie lub użyć adaptera podajnika.
Aby zrobić miejsce w out
, zrób to:
out.resize(s.length());
[edit] inną opcją jest utworzenie ciągu wyjściowego o prawidłowym rozmiarze za pomocą tego konstruktora.
std::string out(s.length(), 'X');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-30 06:05:11
Powiedziałbym, że iterator zwracany przez out.begin()
nie jest poprawny po kilku krokach dla pustego ciągu. Po pierwszym ++
jest ==out.end()
, wtedy zachowanie po następnym przyroście jest niezdefiniowane.
Po tym wszystkim dokładnie do czego służy insert iterator.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-28 21:02:35
To jest sens backinserter: to wstawia elementy do kontenera. używając begin(), przekazujesz iterator do pustego kontenera i modyfikujesz nieprawidłowe Iteratory.
Przepraszam - moje edycje przeszkadzały w komentarzach. Po raz pierwszy zamieściłem coś nie tak przypadkowo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-28 21:04:09