バイナリ データの保持とアクセスに適した C++ コンテナーはどれですか?
std::vector<unsigned char>
また
std::string
一方は他方よりも効率的ですか?
より「正しい」使用法はありますか?
バイナリ データの保持とアクセスに適した C++ コンテナーはどれですか?
std::vector<unsigned char>
また
std::string
一方は他方よりも効率的ですか?
より「正しい」使用法はありますか?
std::vector
よりも優先する必要がありstd::string
ます。通常、両方のソリューションはほぼ同等ですが、std::string
は文字列および文字列操作専用に設計されており、意図した用途ではありません。
どちらも正しく、同等に効率的です。単純な配列の代わりにこれらのいずれかを使用すると、メモリ管理が容易になり、それらを引数として渡すことができます。
ベクトルを使うのは、文字列よりも意図が明確だからです。
編集:std::basic_string
C++03 標準はメモリの連続性を保証しません。ただし、実用的な観点からは、商用の非連続実装はありません。C++0x は、その事実を標準化するように設定されています。
一方は他方よりも効率的ですか?
これは間違った質問です。
より「正しい」使用法はありますか?
これは正しい質問です。
場合によります。データはどのように使用されていますか?fashon のような文字列でデータを使用する場合は、std::vector を使用すると後続のメンテナーが混乱する可能性があるため、std::string を選択する必要があります。一方、ほとんどのデータ操作が単純な数学またはベクトルのように見える場合は、std::vector がより適切です。
これはdribeasの回答へのコメントです。コードをフォーマットできるように、回答として書きます。
これは char_traits 比較関数であり、動作は非常に健全です。
static bool
lt(const char_type& __c1, const char_type& __c2)
{ return __c1 < __c2; }
template<typename _CharT>
int
char_traits<_CharT>::
compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
{
for (std::size_t __i = 0; __i < __n; ++__i)
if (lt(__s1[__i], __s2[__i]))
return -1;
else if (lt(__s2[__i], __s1[__i]))
return 1;
return 0;
}
個人的には、std :: stringの方が好きです。なぜなら、バイナリバッファをC互換の形式に戻したい場合、string :: data()の方がはるかに直感的だからです。ベクトル要素は連続して格納されることが保証されていることを知っています。これをコードで実行すると、少し不安になります。
これは、個々の開発者またはチームが自分で行う必要のあるスタイルの決定です。
バイナリ データを保存するだけの場合はbitset
、スペース割り当てを最適化する which を使用できます。それ以外vector
の場合は、使用法により適しているため、 を選択してください。
この 2 つを比較して、より具体的な方を選択してください。どちらも非常に堅牢で、STL アルゴリズムで動作します...タスクにより効果的な方を選択してください