|
わかってると思うけど、ポインタの引き算(イテレータの引き算)結果は「要素数」っす。
型が char でも int でも double でも、自作クラスでも、要素数であってバイト数じゃない。
4つ戻るような場合に -4 を保持できる必要があるので ptrdiff_t は符号付き。
閑話休題・以下駄文
こう書いたほうがわかりやすいし実用的なのだろうけど
std::vector<char> v2; // 初期要素数0
std::remove_copy(v.begin(), v.end(), std::back_inserter(v2), ' '); // 自動拡張
std::copy(v2.begin(), v2.end(), std::ostream_iterator<char>(std::cout));
std::cout << std::endl;
驚いたことに gcc-4 では remove_copy + back_inserter が通らないっす。
(ネット接続禁止の実験PCに入っている古い cygwin でエラーとなった)
今の cygwin64 な gcc-7.4.0 ではおっけー。この本の書かれた当時はダメだったのかも。
今っつか C++11 や C++14 が使える開発現場では STL のその辺の機能を使う機会は激減してる。
範囲 for とかラムダ式が正式に導入されたあとはそっち使ったほうが圧倒的に楽。
(組み込み系だと故意に古い開発環境を維持していたりするが PC レベルなら更新すべき)
現代 C++ の学習に使う参考書としてはやはり古さを感じるっすね。
もっと新しい本(なり web 記事なり)を探したほうが良い。
for (const auto& c : v2) std::cout << c; // のほうが絶対わかりやすくてタイプ量も少
|