Есть ли способ реализовать аналог Python 'separator' .join () в C ++? - PullRequest
14 голосов
/ 23 мая 2011

Все, что я нашел, это boost::algorithm::string::join. Тем не менее, кажется чрезмерным использовать Boost только для соединения. Так может есть какие-то проверенные временем рецепты?

UPDATE
Извините, заголовок вопроса был плохим. Я ищу метод для объединения строк с разделителем, а не просто для объединения один за другим.

Ответы [ 6 ]

12 голосов
/ 23 мая 2011

Так как вы ищете рецепт , продолжайте и используйте тот из Boost. Как только вы преодолеете всю щедрость, это не так уж сложно:

  1. Выделите место для сохранения результата.
  2. Добавить первый элемент последовательности к результату.
  3. Пока есть дополнительные элементы, добавьте разделитель и следующий элемент к результату.
  4. Вернуть результат.

Вот версия, которая работает на двух итераторах (в отличие от версии Boost, которая работает в диапазоне .

template <typename Iter>
std::string join(Iter begin, Iter end, std::string const& separator)
{
  std::ostringstream result;
  if (begin != end)
    result << *begin++;
  while (begin != end)
    result << separator << *begin++;
  return result.str();
}
12 голосов
/ 23 мая 2011

Если вы действительно хотите ''.join(), вы можете использовать std::copy с std::ostream_iterator до std::stringstream.

#include <algorithm> // for std::copy
#include <iterator>  // for std::ostream_iterator

std::vector<int> values(); // initialize these
std::stringstream buffer;
std::copy(values.begin(), values.end(), std::ostream_iterator<int>(buffer));

Это вставит все значения в buffer. Вы также можете указать пользовательский разделитель для std::ostream_iterator, но он будет добавлен в конце (это существенная разница для join). Если вам не нужен разделитель, это будет делать то, что вы хотите.

1 голос
/ 26 февраля 2019

просто ...:

std::string s = std::accumulate(v.begin()+1, v.end(), std::to_string(v[0]),
                     [](const std::string& a, int b){
                           return a + ", " + std::to_string(b);
                     });
    ```


1 голос
/ 11 октября 2017

Вот еще одна версия, которую я считаю более удобной для использования:

std::string join(std::initializer_list<std::string> initList, const std::string& separator = "\\")
{
    std::string s;
    for(const auto& i : initList)
    {
        if(s.empty())
        {
            s = i;
        }
        else
        {
            s += separator + i;
        }
    }

    return s;
}

Затем вы можете назвать это так:

join({"C:", "Program Files", "..."});
1 голос
/ 14 мая 2017

Если вы используете Qt в своем проекте, вы можете напрямую использовать функцию join QString ( QString Reference ), и она работает, как и ожидалось от python.Некоторые примеры:

QStringList strList;
qDebug() << strList.join(" and ");

Результат: ""

strList << "id = 1";
qDebug() << strList.join(" and ");

Результат: "id = 1"

strList << "name = me";
qDebug() << strList.join(" and ");

Результат: "id = 1 and name = me"

0 голосов
/ 23 мая 2011

C ++ строки реализованы эффективно.

std::string s = s1 + s2 + s3;

Это может быть быстрее:

std::string str;
str.reserve(total_size_to_concat);

for (std::size_t i = 0; i < s.length(); i++)
{
  str.append(s[i], s[i].length());
}

Но это в основном то, что ваш компилятор делает с operator+ и минимумом оптимизации, кромеон угадывает размер, чтобы зарезервировать.
Не стесняйся.Взгляните на реализацию строк.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...