Во время создания прототипа и игры в 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]);
}
};
Звучит как 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 ++, где всегда есть еще одна кухонная раковина!
Других решений пока нет …