如何将vector<int>转换为字符串?

28

我正在尝试将一个值从C++传递到TCL。由于无法传递指针而不使用一些复杂的模块,因此我考虑将向量转换为字符数组,然后将其作为空终止字符串传递(这相对容易)。

我有一个向量,如下所示:

12, 32, 42, 84  

我想将其转换为类似于:

"12 32 42 48"

我考虑的方法是使用迭代器来遍历向量,然后将每个整数转换为字符串表示,然后将其添加到字符数组中(该数组最初通过传递向量的大小来动态创建)。这样做对吗?或者是否已经有一个可以完成此操作的函数?

4个回答

64

这个怎么样?

std::stringstream result;
std::copy(my_vector.begin(), my_vector.end(), std::ostream_iterator<int>(result, " "));

然后你可以传递指针从result.str().c_str()


4
先生,我再也不会忘记 ostream_iterator 和 copy 了。谢谢。 - Björn Pollex
4
@Adrian McCarthy:这个示例代码不需要 #include <string><iterator> 头文件。<sstream> 包含所需的定义。但您确实需要包括 <algorithm><vector><sstream> 头文件。 - Billy ONeal
2
你如何避免末尾空格? - avakar
1
你可以使用 string::erase 来删除末尾的空格。 - Björn Pollex
3
<string>中你可能是对的,但在std::ostream_iterator中需要使用<iterator> - Adrian McCarthy
显示剩余6条评论

8

您可以使用copystringstream对象和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;
}

Output is:

'12 32 42 84'


感谢您删除尾随空格... - Legend
1
如果您在使用ostream_iterator时遇到问题,请将<iterator>作为头文件包含。 - Akshay

4

我会使用stringstream来构建字符串。类似这样:

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.

避免使用我建议中的尾随空格,+1。 - Björn Pollex
如果(it!= vec.begin()),则需要进行额外的比较。 - Viet

2

你说得没错,但是你可以使用 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 简化此过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接