Поиск массива C-строк для подстроения с использованием string_algo/ranges

StackOverflow https://stackoverflow.com/questions/8312975

  •  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] имеет вредный эффект.

Мой главный вопрос, что я должен сделать, чтобы исправить его, и дополнительный вопрос заключается в том, как я могу извлечь тот тип, который требуется 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");
}
Это было полезно?

Решение

Я могу исправить 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]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top