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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++のデバッガでvectorの要素...
-
IE等のブラウザにテキスト入...
-
JQuery、セレクトボックスをル...
-
デジタル時計の時刻合わせの方...
-
マイページはどこを開くの
-
スクリプトって、何ですか?ど...
-
ウインドウを毎回同じ位置、大...
-
Javascript_submit()完了後に処...
-
エクセルのシート上に別のシー...
-
[Java] Edgeでのアドレスバー非...
-
一定時間おきにアラームやポッ...
-
同じページをブラウザで複数開...
-
PDFを(htmlのように)無限に縦...
-
Excelでワードアートや図を常に...
-
VBAのユーザーフォームのframe...
-
Outlookでこのような表示がされ...
-
エクセルVBAでフォームのListbo...
-
Youtubeが勝手に右下に勝手に小...
-
ブロックレベル要素の高さを揃...
-
VBAで任意のウインドウのサイズ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VBA/HTML】特定のタグ要素に...
-
(VBS) テキストファイル読込で...
-
VC++のデバッガでvectorの要素...
-
【VB.NET】HTML要素を取得しよ...
-
MFCを使って、ひとつのkey(CStr...
-
VBA HTTPを用いたWEB画面の取...
-
bxSliderで動画をスライドごと...
-
JavaScriptでクリップボードの...
-
JQuery、セレクトボックスをル...
-
jqueryでtable内容の置き換え
-
ファンクションキーの既存の機...
-
フォームで入力時自動で次の項...
-
[C++] vector<string> の各要素...
-
Ajax.Updaterで読み込んだ先の...
-
モーダルウィンドウにおける処...
-
スプレッドシートのチェックボ...
-
PL/Iについて、教えてください。
-
エクセルでタグの内容が取得で...
-
ページ全体をスクロールするAja...
-
jQueryで<body>要素にマウスが...
おすすめ情報