Насколько мне известно, не существует STL "однострочный", который может генерировать эту последовательность.Вы можете использовать комбинацию алгоритмов, чтобы попытаться разграничить все диапазоны смежных последовательных значений, возможно, используя std::adjacent_difference
, но я искренне думаю, что рукописный цикл будет более элегантным.
На неродственной ноте,Я не уверен, что поддерживаю ваше решение разработать look_n_say
, как у вас.Когда вы написали класс, у вас есть объект, единственная цель которого - записать значения в ostream
.Вы не можете запрашивать отдельные значения из ряда, а также не можете изменять количество значений, которые вы получаете после создания объекта.Вы также с готовностью пересчитываете первые n
номера каждый раз, когда звоните operator <<
, что может быть крайне неэффективно.Я бы посоветовал изменить класс на:
- Кэшировать ранее сгенерированные значения, чтобы вы могли получить их позже.
- Разрешить пользователю запрашивать любое число поиска и произнесения, котороеони хотят, а не просто извлекают первые
n
из них.
Один из возможных вариантов может выглядеть следующим образом:
class LookAndSaySeries {
public:
string getTerm(size_t index) const; // Get the appropriate term of the series.
private:
/* Previously-retrieved values, marked mutable since getTerm() will modify even
* though it's a semantically-const operation.
*/
mutable vector<string> cachedValues; // Values you've handed back before.
void generateNext() const;
};
string LookAndSaySeries::getTerm(size_t index) const {
/* Keep generating values until you have enough to satisfy the request. */
while (index >= cachedValues.size())
generateNext();
return cachedValues[index];
}
void LookAndSaySeries::generateNext() const {
/* ... insert logic here to generate next term ... */
cachedValues.push_back(/* ... that value ... */);
}
Это позволяет легко запрашивать отдельные номера без повторного вычисления.их на каждой итерации.Вы по-прежнему можете печатать значения в поток, как вы делали это раньше, но теперь у вас есть более точный контроль над тем, как создаются числа.