Как вернуть постоянный вид std :: string?

Во время создания прототипа и игры в C ++, пробуя некоторые концепции для создания неизменяемой строки с поддержкой utf8, я стоял перед следующей дилеммой:

Есть ли способ вернуть неизменный вид строки. Например, вместо возврата подстроки, я хочу иметь возможность вернуть подстроку, которая ссылается на часть исходной строки.

// Just some quick prototyping of ideas.
// Heavier than just a normal string.
// Construction would be heavier too because of the indices vector.
// Size would end up being O1 though.
// Indexing would also be faster.

struct ustring {
std::string data;
std::vector<size_t> indices;

// How do I return a view to a string?

std::string operator [](size_t const i) const {
return data.substr(indices[i], indices[i + 1] - indices[i]);
}
};

2

Решение

Звучит как std::string_view это класс для вас! Если у вас нет поддержки C ++ 17, попробуйте std::experimental::string_view. Если это не доступно, попробуйте boost::string_view. Все эти варианты можно использовать одинаково (просто замените std::string_view с тем, что вы используете):

std::string_view operator [](size_t const i) const {
return std::string_view(&data[i], 1);
}

Добро пожаловать в C ++, где всегда есть еще одна кухонная раковина!

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]