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:

  1. pisanie wielkimi literami
  2. 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);
Author: sivabudh, 2009-09-29

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');

 41
Author: hrnt,
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.

 2
Author: Michael Krelin - hacker,
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.

 0
Author: RED SOFT ADAIR,
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