質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

C++ 文字列中に含まれる特定文字をカウントする最適解はまだありそう?

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 12K+

opyon

score 991

解決!

@LouiS0616さん回答より
std::cbegin

std::string src = "aabbcc";
std::count(src.cbegin(), src.cend(), 'a')

質問の経緯や現状

・std::stringにcountがあると思ったら無いので調べるとstd::countでカウント出来そう
・std::countはコンテナ型に適用できる
・文字列を配列に変換する必要がありchar型が良さそうだけどコンテナじゃない
・char型をvectorに変換する必要がある
・以上のような経緯を踏まえて文字列に含まれる特定文字をカウントさせている
最適解が分からず現状サンプルコードのような処理をしています

知りたいこと

サンプルコード中の
vector<char> v(src, src + sizeof(src));
src + sizeof(src)これはどういう意味があるのでしょうか?(調べても理解に至りませんでした)

また、サンプルコードが最適解なのか他にもっとシンプルな定型の処理方法があるのかなども知りたいです。

参考にしたリンクなど

std::count
sizeof演算子

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// サンプルコード
// char配列srcに含まれる'a'を数える
int main()
{
    char src[] = "aabbcc";
    vector<char> v(src, src + sizeof(src));
    cout << count(v.begin(), v.end(), 'a');

    getchar();
    return 0;
}

// 出力結果
// 2

環境

※コンパイラはC++14です

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

std::string src = "aabbcc";
std::cout << std::count(src.cbegin(), src.cend(), 'a') << "\n";
char src[] = "aabbcc";
std::cout << std::count(std::cbegin(src), std::cend(src), 'a') << "\n"; 

src + sizeof(src) これはどういう意味があるのでしょうか?(調べても理解に至りませんでした)

sizeof(char)が1であるのは規格で保証されているので、次のように書くのと同じです。

src + sizeof(src) / sizeof(src[0])


つまりは先頭ポインタに文字列長(終端文字含む)を足しているのです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/22 22:22

    回答ありがとうございます。
    std::stringのままでも参照出来ることを知れて助かりました。
    今後使わさせていただきたいと思います。

    >sizeof(char)が1であるのは規格で保証されている
    >つまりは先頭ポインタに文字列長(終端文字含む)を足しているのです。
    なるほど理解できました。
    改めて検索し直すと確かにsizeof(src) / sizeof(src[0])のままで書かれている参考情報もありました。
    https://bi.biopapyrus.jp/cpp/syntax/string.html

    C言語の学習を進めるならポインタは避けては通れないとは思っていますが、
    今はなるべく使わないようにしたいので助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る