Моя проблема довольно проста: у меня есть динамический массив объектов, у которых есть метод , возвращающий строку. Я хочу объединить все эти строки вместе.Конкатенатные строки, предоставляемые методом класса в C++
Если бы я был массив строк вместо объектов с методом, возвращающим строки, это было бы тривиальная задача:
std::vector<std::string> v{ "f", "o", "o" };
std::string const x = std::accumulate(v.begin(), v.end(), std::string());
Но в моем случае это скорее выглядит следующим образом:
struct foo
{
foo(std::string const & name) : name_(name) {}
std::string const & name() const { return name_; }
private:
std::string const name_;
};
std::vector<foo> v{ foo("f"), foo("o"), foo("o") };
Я хотел бы использовать стандартные библиотечные алгоритмы, так как я уверен, что это эффективный и что-то, что мне не нужно отлаживать, но это слишком сложно читать и понимать:
std::vector<std::string> transformed(v.size());
std::transform(v.begin(), v.end(), transformed.begin(),
[](foo const & f) { return f.name(); });
std::string const x = std::accumulate(transformed.begin(), transformed.end(),
std::string());
Будущие Сопровождающие, вероятно (и это справедливо) поохотиться меня пробивать мне в лицо для понапрасну усложняя легкой задачей, которая могла бы быть сделано с:
std::string x;
for(auto const & f : v)
x += f.name();
ли там что-то более легкое здесь, чего я не вижу, или это действительно так: , где нужно позволить стандартным библиотекам отдыхать, и использовать цикл for ( , что накапливает в любом случае)?
Я бы поставил под вопрос ваше желание: алгоритмы 'std' в основном предшествуют итерации на основе рангов, и многие из более простых алгоритмов лучше всего делать явно, особенно сейчас. – Yakk