• 締切済み

vectorで文字列の配列を使う方法

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

みんなの回答

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

> ベクタの中身がポインタだと、スレッドアンセーフになるので、お勧めしません。 格納したら、参照オンリーで更新しないなら大丈夫ですが。

すると、全ての回答が全文表示されます。
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.4

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

すると、全ての回答が全文表示されます。
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

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

すると、全ての回答が全文表示されます。
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

> 実体をコピーするにはどうしたらよいですか? これを行うとなると、結局、文字列を保持するクラス(or 配列)を作ることになるので、アクセス速度という点では std::string を避ける意味合いは薄れると思います。 そして、文字定数として参照するだけなら実体をコピーする必要もなさそうです。 そもそも、std::string::c_str() は通常、先頭アドレスのポインタを返す程度の仕事を、inline で行っているだけなので(手元のg++等を見ても)、これを使ったからといってアクセスが劇的に遅くなるようなことはないですが…。 > このようになった方が高速にアクセスできると思うので、 > このようなデータで配列に入れる方法も知りたいです。 根拠はなんですか?多分、幻想(or 勘違い)だと思いますが。 配列に先頭アドレスを保持している時点で、アドレスの増分が一定でもアクセス速度は向上しません。むしろ、キャッシュのヒットを考えると、一般論では近いアドレスにロードされる方が高速になる可能性が高い(または誤差の範囲)ように思われます。 # 環境次第だと思いますが、後者が早い理由を思いつきません。

すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> vector<string>を使用せずpush_back("aaa")が使えるようなvector配列を用意することはできませんか? 単にpush_back("aaa")が使えるようにするだけであれば、std::vector<const char*>で十分ですが、文字列の実体をコピーするのなら、別の方法が必要です。

kinuasa
質問者

お礼

[]でなく*でできるのは気がつきませんでした。 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 このようになった方が高速にアクセスできると思うので、このようなデータで配列に入れる方法も知りたいです。

すると、全ての回答が全文表示されます。

関連するQ&A