Предполагая, что я правильно понимаю проблему, следующая простая реализация также выглядит очень простой и легкой.Эта функция работает в C ++ 11 и более поздних версиях:
DEMO с 5 тестовыми наборами
std::string concatenate(
const std::vector<int>& indecies,
const std::string& delimiter = ", ",
const std::string& tag = "Transform#")
{
if(indecies.empty()){
return "";
}
std::string s(tag + std::to_string(indecies[0]));
for(auto it = indecies.begin()+1; it != indecies.cend(); ++it){
s += (delimiter + tag + std::to_string(*it));
}
return s;
}
(Кстати, как для этой функцииconcatenate
, если indecies
пусто, возвращаемое значение также является пустой строкой, а не исключениями (единица AndreasDM) или UB (единица Everlight). И если indecies
имеет только один элемент, например indecies={1}
,тогда результат будет "Transform#1”
, а не "Transform#1, ”
(один из YSC) или ", Transform#1”
(один из sakra). Они отличаются от других ответов, и эта функция будет более простой, если эта обработка будет удалена.)
Несмотря на то, что производительность не может быть основной, указанную выше функцию можно слегка оптимизировать, предварительно сохранив минимальную емкость для сохранения результирующей строки на std::basic_string::reserve
следующим образом.Здесь +1
в *.size()+1
означает минимальную длину числового символа.Я также удалил delimiter+tag
в цикле for.Это все еще выглядит просто:
DEMO с 5 тестовыми примерами
std::string concatenate_fast(
const std::vector<int>& indecies,
std::string delimiter = ", ",
const std::string& tag = "Transform#")
{
if(indecies.empty()){
return "";
}
std::string s(tag + std::to_string(indecies[0]));
delimiter += tag;
s.reserve((tag.size()+1) + (indecies.size()-1)*(delimiter.size()+1));
for(auto it = indecies.begin()+1; it != indecies.cend(); ++it){
s += (delimiter + std::to_string(*it));
}
return s;
}
Я также проверил производительность этих функций и некоторые предлагаемые ответыследующее.Эти тесты выполняются с помощью Quick C ++ Benchmark в рамках оптимизации gcc-8.2, C ++ 17 и O3.Поскольку std::transform_reduce
по-прежнему недоступен в Quick C ++ Benchmark, я не проверял его.Приведенный выше concatenate_fast
показывает лучшую производительность, по крайней мере, в этих случаях, а concatenate
- второй.
Наконец, лично, принимая во внимание баланс читабельности и производительности, я хотел бы предложитьвыше concatenate
как решение:
- Тест производительности с размерами 2 и 8. ( DEMO )
- Тест производительности с размерами 16 и 32. ( DEMO )