Я хотел бы скопировать содержимое вектора
в одну длинную строку
с настраиваемым разделителем. Пока я пробовал:
// .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
но я получаю странные символы в строке.
Может ли кто-нибудь помочь мне разобраться в том, чего здесь ожидает компилятор?
С ++ 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;
});
Еще один способ сделать это:
#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')
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;
}
Несколько моментов:
более быстрый вариант:
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