我有以下字符串:
1 -2 -8 4 51
我想得到一个包含5个元素的向量,每个元素对应于字符串中的5个数字。基本上,我想将空格分隔上面的字符串作为分隔符。
我在Stack Overflow上发现了很多这样的问题,但到目前为止,他们中的任何一个都不能得到第一个“1”和最后一个(来自51
)。
我的代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
std::vector<std::string> split(std::string str)
{
std::string buf;
std::stringstream ss(str);
vector<std::string> tokens;
while (ss >> buf)
tokens.push_back(buf);
return tokens;
}
int main()
{
std::string temps = "1 -2 -8 4 51";
std::vector<std::string> x = split(temps);
for (int j = 0; j < x.size(); j++){
cout << x[j] << endl;
}
}
我的输出如下:
-2
-8
4
5
如您所见,跳过了第一个和最后一个。
我对C ++很新(我可能已经习惯了其他语言的内置函数.split()
)但我在上面的代码中看不出任何错误。
谁能帮助我理解我做错了什么?
答案 0 :(得分:1)
你展示的代码一般都很好。输出是预期的,因此问题必须超出您显示的代码。
但请注意,您的vector
将包含std::string
个值,而不是int
个值。此外,您应该考虑使用std::istringstream
作为输入,而不是使用std::stringstream
。
如果你想要一个整数向量,试试这个:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
std::vector<int> split(const std::string &str)
{
int num;
std::istringstream iss(str);
std::vector<int> tokens;
while (iss >> num)
tokens.push_back(num);
return tokens;
}
int main()
{
std::string temps = "1 -2 -8 4 51";
std::vector<int> x = split(temps);
for (int j = 0; j < x.size(); j++) {
std::cout << x[j] << std::endl;
}
return 0;
}
然后,您可以split()
使用std::istream_iterator
和std::back_inserter
而不是手动循环,例如:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>
std::vector<int> split(const std::string &str)
{
std::istringstream iss(str);
std::vector<int> tokens;
std::copy(
std::istream_iterator<int>(iss),
std::istream_iterator<int>(),
std::back_inserter(tokens)
);
return tokens;
}
int main()
{
std::string temps = "1 -2 -8 4 51";
std::vector<int> x = split(temps);
for (int j = 0; j < x.size(); j++) {
std::cout << x[j] << std::endl;
}
return 0;
}
然后你可以让`split()成为一个模板函数,这样它就可以根据你想要的输入字符串返回不同类型的向量,例如:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>
template<typename T>
std::vector<T> split(const std::string &str)
{
std::istringstream iss(str);
std::vector<T> tokens;
std::copy(
std::istream_iterator<T>(iss),
std::istream_iterator<T>(),
std::back_inserter(tokens)
);
return tokens;
}
int main()
{
std::string temps = "1 -2 -8 4 51";
std::vector<int> x = split<int>(temps);
for (int j = 0; j < x.size(); j++) {
std::cout << x[j] << std::endl;
}
return 0;
}