32

2つのstd::stringがあります。入力文字列を指定して、次のようにします。

  1. すべての文字を大文字にする
  2. 大文字を出力文字列に割り当てます。

なぜこれが機能するのですか?

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);

しかし、これはそうではありません(プログラムがクラッシュする結果になります)?

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), out.begin(), std::toupper);

これは機能するためです(少なくとも同じ文字列では:

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), s.begin(), std::toupper);
4

3 に答える 3

48

にスペースがありませんout。C++ アルゴリズムは、ターゲット コンテナーを自動的に拡張しません。スペースは自分で作るか、インサーター アダプターを使用する必要があります。

にスペースを作るにはout、次の操作を行います。

out.resize(s.length());

[編集] 別のオプションは、このコンストラクターで正しいサイズの出力文字列を作成することです。

std::string out(s.length(), 'X');

于 2009-09-28T20:57:48.463 に答える
2

によって返されたイテレータはout.begin()、空の文字列を数回インクリメントした後は無効であると言えます。最初++のそれの==out.end()後、次のインクリメント後の動作は未定義です。

結局のところ、これはまさに挿入イテレータの目的です。

于 2009-09-28T20:57:17.833 に答える
0

それが backinserter の意味です。コンテナに要素を挿入します。begin() を使用して、反復子を空のコンテナーに渡し、無効な反復子を変更します。

申し訳ありません - 私の編集があなたのコメントを妨げました。最初に誤って間違ったものを投稿しました。

于 2009-09-28T20:56:34.963 に答える