std::vector を std::string に、またはその逆に直接型キャストすることはできません。しかし、STL コンテナーが提供する反復子を使用すると、ベクトルと文字列の両方を同じ方法で反復処理できます。また、関数が問題のコンテナーへのランダム アクセスを必要とする場合は、どちらでも機能します。
std::vector<char> str1 {'a', 'b', 'c'};
std::string str2 = "abc";
template<typename Iterator>
void iterator_function(Iterator begin, Iterator end)
{
for(Iterator it = begin; it != end; ++it)
{
std::cout << *it << std::endl;
}
}
iterator_function(str1.begin(), str1.end());
iterator_function(str2.begin(), str2.end());
最後の 2 つの関数呼び出しはどちらも同じものを出力します。
ここで、文字列またはベクトルに格納されている文字のみを解析する汎用バージョンを書きたい場合は、内部配列を反復するものを書くことができます。
void array_function(const char * array, unsigned length)
{
for(unsigned i = 0; i < length; ++i)
{
std::cout << array[i] << std::endl;
}
}
次のシナリオでは、どちらの関数も同じことを行います。
std::vector<char> str1 {'a', 'b', 'c'};
std::string str2 = "abc";
iterator_function(str1.begin(), str1.end());
iterator_function(str2.begin(), str2.end());
array_function(str1.data(), str1.size());
array_function(str2.data(), str2.size());
問題を解決するには常に複数の方法があります。利用可能なものに応じて、任意の数のソリューションが機能する可能性があります。両方を試して、どちらがアプリケーションに適しているかを確認してください。反復子の型がわからない場合は、char 型の配列反復が役立ちます。渡すテンプレート型が常にあることがわかっている場合は、テンプレート iterator メソッドの方が便利かもしれません。