std :: vector в строку с настраиваемым разделителем

Я хотел бы скопировать содержимое вектора в одну длинную строку с настраиваемым разделителем. Пока я пробовал:

// .h
string getLabeledPointsString(const string delimiter=",");
// .cpp
string Gesture::getLabeledPointsString(const string delimiter) {
    vector<int> x = getLabeledPoints();
    stringstream  s;
    copy(x.begin(),x.end(), ostream_iterator<int>(s,delimiter));
    return s.str();
}

, но получаю

no matching function for call to ‘std::ostream_iterator<int, char, std::char_traits<char> >::ostream_iterator(std::stringstream&, const std::string&)’

Я пробовал с charT * , но получаю

error iso c++ forbids declaration of charT with no type

Затем я попытался использовать char и ] ostream_iterator (s, & разделитель) но я получаю странные символы в строке.

Может ли кто-нибудь помочь мне разобраться в том, чего здесь ожидает компилятор?

27
задан Michael Kristofik 14 February 2012 в 14:14
поделиться

4 ответа

С ++ 11:

vector<string> x = {"1", "2", "3"};
string s = std::accumulate(std::begin(x), std::end(x), string(),
                                [](string &ss, string &s)
                                {
                                    return ss.empty() ? s : ss + "," + s;
                                });
13
ответ дан 28 November 2019 в 04:41
поделиться

Еще один способ сделать это:

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

template <typename T>
string join(const T& v, const string& delim) {
    ostringstream s;
    for (const auto& i : v) {
        if (&i != &v[0]) {
            s << delim;
        }
        s << i;
    }
    return s.str();
}

int main() {
    cout << join(vector<int>({1, 2, 3, 4, 5}), ",") << endl;
}

(хотя c ++ 11 основан на диапазоне для цикла и 'auto')

12
ответ дан 28 November 2019 в 04:41
поделиться
string join(const vector<string> & v, const string & delimiter = ",") {
    string out;
    if (auto i = v.begin(), e = v.end(); i != e) {
        out += *i++;
        for (; i != e; ++i) out.append(delimiter).append(*i);
    }
    return out;
}

Несколько моментов:

  • вам не нужно дополнительное условие, чтобы избежать дополнительного конечного разделителя
  • , убедитесь, что вы не потерпите крах, когда вектор пусто
  • не делайте кучу временных (например, не делайте этого: x = x + d + y)
2
ответ дан 28 November 2019 в 04:41
поделиться

более быстрый вариант:

vector<string> x = {"1", "2", "3"};
string res;
res.reserve(16);

std::accumulate(std::begin(x), std::end(x), 0,
                [&res](int &, string &s)
                {
                    if (!res.empty())
                    {
                        res.append(",");
                    }
                    res.append(s);
                    return 0;
               });

он не создает промежуточные строки, а просто выделяет память один раз для всего результата строки и добавляет каждый элемент в конец & amp; res

-1
ответ дан 28 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: