Поиск массива c-строк для подстроки с использованием string_algo/range
Мне нужно искать массив с-строк для подстроки.
Я создал то, что, как я думал, вернул бы мне ответ, но это только синтаксически правильно, но семантически неправильно, но я не уверен, где я ошибся.
Есть также подвопрос к этому. Который я спрошу после того, как покажу вам пример, который я пробовал.
#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]
оказывает вредное воздействие.
Мой главный вопрос, что я должен сделать, чтобы исправить это, и дополнительный вопрос, как я могу извлечь тип, который find_first требует из constCharRange или действительно любого такого typedef.
Редактировать:
Я вижу, что я использовал конец неправильно. Затем мне удалось получить немного другой пример для работы, однако они не совместимы с определениями, которые я на самом деле должен использовать (я могу добавить в код, но не изменить существующее определение).
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");
}
1 ответ
Я могу исправить 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]