【お題】王手、そして

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すればよいでしょうか?
よろしくお願いします。

A 回答 (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

ちょっと長くなってしまいました
余計なことも混じってきたのでここまでにしておきます


>この方法のままでコードするとしたら、どう書けばエラーなく通ったでしょうか?
上記にも書いた通り
根本的に勘違いをしている部分があるため
このコードの方法のまま、というのが難しいです
どうしてもちょっと違う感じになってしまいます
    • good
    • 0
この回答へのお礼

iteratorとポインタは、扱いがとても似ているので、いつのまにか同じものと刷り込まれていましたが、確かに別物ですね......
根本的な勘違いの意味がよくわかりました!
勉強になります、ありがとうございました。

お礼日時:2020/05/26 14:34

一行にまとめて書くと無駄に見づらくなるのでオススメしません


一処理ずつ丁寧に書くことをオススメします

やりたいことは、「各要素の末尾の文字を大文字にしたい」
ということでいいのですよね?

*( *(word.end()-1) + *( word.end()-1 )->length() - 1 ) += 'a' - 'A';
ちょっと見づらくて、何をしたかったのかがソースから分かりづらかったのですが
多分無駄な処理が多いかな?

このソースを直すとしたらこんな感じ
https://wandbox.org/permlink/NoiZ84qEVUMlk09M

で、これだと冗長で色々と不都合があります
小文字が入っていなかった場合や、そもそもvectorの各要素の処理は出来ません
それを直すとこんなかんじ
https://wandbox.org/permlink/UkC0fzl0e27OmbW2
もっと別の書き方も出来ます

質問者さんはポインタやイテレータをちょっと勘違いしている気がします
また、string型もイテレータを使えること
イテレータを使わずとも最後の要素を指定して取得できることを覚えると良いでしょう
    • good
    • 0
この回答へのお礼

やってみます

早速ありがとうございます。
ありゃ、toupper(), back()なんて便利な関数が。
また一つ賢くなりました...

私が表現したかったのは、
wordの最終要素には、string型の文字列の先頭のアドレスが入っている
→そこに文字列の長さを足して1引くと、文字列の末尾のアドレスを指定できる
と考えた表現でした。
確かに冗長ですね(汗)
参考までに、もし冗長さは無視して、この方法のままでコードするとしたら、どう書けばエラーなく通ったでしょうか?

ご指摘、改めて感謝です。
スマートなコーディングができるよう精進します。

お礼日時:2020/05/26 13:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報