アプリ版:「スタンプのみでお礼する」機能のリリースについて

vector<string>を使用せずpush_back("aaa")が使えるようなvector配列を用意することはできませんか?
vector<char[4]> vec;ができたらうれしいのですがこれはコンパイルできませんでした。

A 回答 (5件)

> ベクタの中身がポインタだと、スレッドアンセーフになるので、お勧めしません。



格納したら、参照オンリーで更新しないなら大丈夫ですが。
    • good
    • 0

ベクタの中身がポインタだと、スレッドアンセーフになるので、


お勧めしません。
    • good
    • 0

# 2です。



ごめんなさい。
> 結局、文字列を保持するクラス(or 構造体)を作ることになるので
に訂正。
    • good
    • 0

> 実体をコピーするにはどうしたらよいですか?



これを行うとなると、結局、文字列を保持するクラス(or 配列)を作ることになるので、アクセス速度という点では std::string を避ける意味合いは薄れると思います。
そして、文字定数として参照するだけなら実体をコピーする必要もなさそうです。

そもそも、std::string::c_str() は通常、先頭アドレスのポインタを返す程度の仕事を、inline で行っているだけなので(手元のg++等を見ても)、これを使ったからといってアクセスが劇的に遅くなるようなことはないですが…。


> このようになった方が高速にアクセスできると思うので、
> このようなデータで配列に入れる方法も知りたいです。

根拠はなんですか?多分、幻想(or 勘違い)だと思いますが。

配列に先頭アドレスを保持している時点で、アドレスの増分が一定でもアクセス速度は向上しません。むしろ、キャッシュのヒットを考えると、一般論では近いアドレスにロードされる方が高速になる可能性が高い(または誤差の範囲)ように思われます。
# 環境次第だと思いますが、後者が早い理由を思いつきません。
    • good
    • 0

> vector<string>を使用せずpush_back("aaa")が使えるようなvector配列を用意することはできませんか?



単にpush_back("aaa")が使えるようにするだけであれば、std::vector<const char*>で十分ですが、文字列の実体をコピーするのなら、別の方法が必要です。
    • good
    • 0
この回答へのお礼

[]でなく*でできるのは気がつきませんでした。
char *str = "bbb";でstrcpy(str, "aaa");はできませんからね。

実体をコピーするにはどうしたらよいですか?
std::vector<const char*>でpush_back("aaa")ができましたが、"aaa"や"bbb"の文字列の先頭アドレスを配列にして高速でアクセスしたいと考えています。
vec[0]は"aaa"の先頭アドレスで値は100000
vec[1]の"bbb"の先頭アドレスで値は100200
vec[2]の"ccc"の先頭アドレスで値は100030
こういうものでなく、
vec[0]は"aaa"の先頭アドレスで値は100000
vec[1]の"bbb"の先頭アドレスで値は100100
vec[2]の"ccc"の先頭アドレスで値は100200
このようになった方が高速にアクセスできると思うので、このようなデータで配列に入れる方法も知りたいです。

お礼日時:2006/04/11 14:04

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