
C++言語で記述しているプログラムです。
stringの末尾の文字を指定しようと思っています。
今、
std::vector<std::string> word;
と宣言されたコンテナ word の各要素に文字列が入っています。
この各文字列の末尾が現在大文字で、小文字にしたいのです。
例えば、word の最後尾要素の string についてのみ考えると、
*( *(word.end()-1) + *( word.end()-1 )->length() - 1 ) += 'a' - 'A';
としたのですが、うまくいきませんでした。
エラーコードを見ると、
*( word.end()-1 )->length() - 1
の部分が間違っているようです。
別の解決策、というのは一旦なしにして、vector コンテナの string 要素の length はどのように実行sすればよいでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
>wordの最終要素には、string型の文字列の先頭のアドレスが入っている
イメージを捉える上ではその考え方でも悪くは無いのですが
勉強を進めていく上で後々混乱してしまうかもしれません
vectorのiteratorで示されるのは<>で指定された型です
つまり今回の場合は
string型そのものが示されます
string型の文字列の先頭のアドレスが入っているという考え方だと
こういう使い方ができると考えてしまうかもしれませんが
https://wandbox.org/permlink/avPTGPZq9AoBlKTN
こうやるのはエラーです
じゃあ、string型のポインタか?といったらそうでもありません
https://wandbox.org/permlink/7otBehc96PpiUA2n
あくまで
iteratorはiteratorなので
https://wandbox.org/permlink/c0eRWx7nTlyq1F3b
こうなります(warningが出てますが変数を使用してないからで、コンパイルは通ってます)
じゃあ、中身を見るには?
https://wandbox.org/permlink/ol3YZAHdqFUkPs8w
こんな感じですね
ただ上記の方法だとstring型の変数にコピーをしているため
その変数の値を変えたところでvector側の値が変わるわけではありません
https://wandbox.org/permlink/CpIcgTjqXL416YH0
ちょっと長くなってしまいました
余計なことも混じってきたのでここまでにしておきます
>この方法のままでコードするとしたら、どう書けばエラーなく通ったでしょうか?
上記にも書いた通り
根本的に勘違いをしている部分があるため
このコードの方法のまま、というのが難しいです
どうしてもちょっと違う感じになってしまいます
iteratorとポインタは、扱いがとても似ているので、いつのまにか同じものと刷り込まれていましたが、確かに別物ですね......
根本的な勘違いの意味がよくわかりました!
勉強になります、ありがとうございました。
No.1
- 回答日時:
一行にまとめて書くと無駄に見づらくなるのでオススメしません
一処理ずつ丁寧に書くことをオススメします
やりたいことは、「各要素の末尾の文字を大文字にしたい」
ということでいいのですよね?
*( *(word.end()-1) + *( word.end()-1 )->length() - 1 ) += 'a' - 'A';
ちょっと見づらくて、何をしたかったのかがソースから分かりづらかったのですが
多分無駄な処理が多いかな?
このソースを直すとしたらこんな感じ
https://wandbox.org/permlink/NoiZ84qEVUMlk09M
で、これだと冗長で色々と不都合があります
小文字が入っていなかった場合や、そもそもvectorの各要素の処理は出来ません
それを直すとこんなかんじ
https://wandbox.org/permlink/UkC0fzl0e27OmbW2
もっと別の書き方も出来ます
質問者さんはポインタやイテレータをちょっと勘違いしている気がします
また、string型もイテレータを使えること
イテレータを使わずとも最後の要素を指定して取得できることを覚えると良いでしょう
早速ありがとうございます。
ありゃ、toupper(), back()なんて便利な関数が。
また一つ賢くなりました...
私が表現したかったのは、
wordの最終要素には、string型の文字列の先頭のアドレスが入っている
→そこに文字列の長さを足して1引くと、文字列の末尾のアドレスを指定できる
と考えた表現でした。
確かに冗長ですね(汗)
参考までに、もし冗長さは無視して、この方法のままでコードするとしたら、どう書けばエラーなく通ったでしょうか?
ご指摘、改めて感謝です。
スマートなコーディングができるよう精進します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
DLLファイルの逆コンパイラにつ...
-
逆コンパイルと逆アセンブルの...
-
CSSが全く分かりません、お助け...
-
プログラマー達は何故、プログ...
-
Windows Formアプリからコンソ...
-
次の日本語の意味を教えて下さい
-
プログラム言語について c言語...
-
バッチファイルで以下のような...
-
Cのプログラムからアクセスでき...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
今ってプログラミング言語は何...
-
gccを行ってもexeファイルが生...
-
最初に聞かれたこと
-
プログラミング言語についてc++...
-
PIC12F1822でLED調光器を作りたい
-
C言語について(初心者)
-
プログラミングc++を全く分か...
-
C# で 数式文字列処理を処理す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VBA/HTML】特定のタグ要素に...
-
JavaScriptでクリップボードの...
-
ajax
-
JQuery、セレクトボックスをル...
-
モーダルウィンドウにおける処...
-
PL/Iについて、教えてください。
-
エクセルでタグの内容が取得で...
-
スプレッドシートのチェックボ...
-
bxSliderで動画をスライドごと...
-
VC++のデバッガでvectorの要素...
-
WebサイトのHTMLオブジェクトの...
-
(VBS) テキストファイル読込で...
-
lispについて質問です
-
ajaxで追加したdom要素にscript...
-
MFCを使って、ひとつのkey(CStr...
-
フォームで入力時自動で次の項...
-
[C++] vector<string> の各要素...
-
VBAでセル参照して要素の順番を...
-
離れている文字の色だけ同時に...
-
デジタル時計の時刻合わせの方...
おすすめ情報