Ответ 1
Как насчет:
std::stringstream result;
std::copy(my_vector.begin(), my_vector.end(), std::ostream_iterator<int>(result, " "));
Затем вы можете передать указатель из result.str().c_str()
Я пытаюсь передать значение из С++ в TCL. Поскольку я не могу передавать указатели без использования некоторых сложных модулей, я думал о преобразовании вектора в массив char, а затем передавал его как строку с нулевым завершением (что относительно легко).
У меня есть вектор следующим образом:
12, 32, 42, 84
который я хочу преобразовать во что-то вроде:
"12 32 42 48"
Подход, о котором я думаю, состоит в том, чтобы использовать итератор для итерации по вектору, а затем преобразовать каждое целое число в его строковое представление, а затем добавить его в массив char (который динамически создается изначально путем передачи размера вектор). Правильно ли это или есть функция, которая уже делает это?
Как насчет:
std::stringstream result;
std::copy(my_vector.begin(), my_vector.end(), std::ostream_iterator<int>(result, " "));
Затем вы можете передать указатель из result.str().c_str()
Вы можете использовать copy
в сочетании с объектом stringstream
и адаптером ostream_iterator
:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v;
v.push_back(12);
v.push_back(32);
v.push_back(42);
v.push_back(84);
stringstream ss;
copy( v.begin(), v.end(), ostream_iterator<int>(ss, " "));
string s = ss.str();
s = s.substr(0, s.length()-1); // get rid of the trailing space
cout << "'" << s << "'";
return 0;
}
Выход:
'12 32 42 84 '
Я бы использовал строковый поток для создания строки. Что-то вроде:
std::vector<int>::const_iterator it;
std::stringstream s;
for( it = vec.begin(); it != vec.end(); ++it )
{
if( it != vec.begin() )
s << " ";
s << *it;
}
// Now use s.str().c_str() to get the null-terminated char pointer.
Вы поняли это правильно, но вы можете использовать std::ostringstream
для создания массива char.
#include <sstream>
std::ostringstream StringRepresentation;
for ( vector<int>::iterator it = MyVector.begin(); it != MyVector.end(); it++ ) {
StringRepresentation << *it << " ";
}
const char * CharArray = StringRepresentation.str().c_str();
В этом случае CharArray
предназначен только для чтения. Если вы хотите изменить значения, вам придется его скопировать. Вы можете упростить это, используя Boost.Foreach.