string_algo/rangesを使用してサブストリング用のcストリングの配列を検索する
-
25-10-2019 - |
質問
cストリングの配列を検索する必要があります。
私は答えを返すと思ったものを作成しましたが、それは構文的に正しいだけですが、意味的に間違っていますが、どこで間違ったのかはわかりません。
これにはサブ質問もあります。私が試した例を示した後、私はこれを尋ねます。
#include <boost/algorithm/string/find.hpp>
const char Months[12][20] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
void Test()
{
typedef boost::iterator_range<boost::range_iterator<const char [20]>::type > constCharRange;
boost::iterator_range<char const *> ir = find_first("January", months);
}
ir.first == ir.last
イテレーターの結果は、私がこれを正しく書いていないことを示しています。
最初のパラメーターが実際にあるという事実がわかりません const char [8]
有害な効果があります。
私の主な質問は、それを修正するために何をすべきか、そして補足的な質問は、constcharrangeまたは実際にそのようなtypedefから必要なタイプをどのように抽出できるかということです。
編集:
Endを誤って使用したことがわかります。その後、わずかに異なる例を取得することができましたが、実際に使用する必要がある定義と互換性がありません(コードに追加できますが、既存の定義を変更できません)。
const std::string Months[]= { /*same data as before*/
void StringTest2()
{
const std::string* sptr =0;
sptr = std::find(boost::begin(Months), boost::end(Months), std::string("February"));
if (sptr)
{
string sResult(*sptr);
}
}
別のテスト
const char* Months[]= { /*same data as before*/
void StringTest3()
{
const char **sptr = std::find(boost::begin(Months), boost::end(Months), "February");
if (sptr)
{
string sResult(*sptr);
}
}
これが私が手に入れることができる最も近いですが、返品タイプの仕様を正しく取得できないようです
void StringTest4()
{
const char Months[12][20]Months[]= { /*same data as before*/
std::find(boost::begin(Months), boost::end(Months), "February");
}
解決
StringTest4を修正して正確な一致を行うことができますが、このソリューションは部分的なものでは機能しません。
void StringTest4()
{
boost::range_iterator<const char [12][20]>::type sptr = std::find(boost::begin(Months), boost::end(Months), std::string("February"));
if (sptr)
{
string sResult(*sptr);
}
}
単にではなくstd :: stringの通過に注意してください "February"
これを行わない場合 std::find
したがって、失敗につながるポインター比較を行うだけです。
私はまだstring_algoでこれを使用したいと思っていますが、それが正常に作業するために必要なビットがまだわかりません const char Months[12][20]
所属していません StackOverflow