我知道这是一个非常容易的问题,但我只想一劳永逸地解决这个问题
我只想使用字符作为拆分分隔符将字符串拆分为数组.(很像C#着名的.Split()函数.我当然可以应用蛮力方法,但我想知道是否还有更好的方法.
到目前为止,我已经搜索过,可能最接近的解决方案方法是使用strtok(),但由于它的不便(将字符串转换为字符数组等),我不喜欢使用它.有没有更简单的方法来实现这个?
注意:我想强调这一点,因为人们可能会问"蛮力怎么行不通".我的强力解决方案是创建一个循环,并使用里面的substr()函数.但是,由于它需要起点和长度,因此当我想分割日期时它会失败.因为用户可能会在7/12/2012或07/3/2011输入它,在计算"/"分隔符的下一个位置之前,我可以真正地告诉它长度.
可能重复:
如何在C++中拆分字符串?
我需要用单个空格分割一个字符串并将其存储到一个字符串数组中.我可以使用istringstream实现这一点,但我无法实现的是:
我希望每个空格都能终止当前的单词.因此,如果连续有两个空格,则我的数组中的一个元素应为空白.
例如:
(下划线表示空格)
This_is_a_string.
gets split into:
A[0] = This
A[1] = is
A[2] = a
A[3] = string.
This__is_a_string.
gets split into:
A[0] = This
A[1] = ""
A[2] = is
A[3] = a
A[4] = string.
Run Code Online (Sandbox Code Playgroud)
我该如何实现呢?
以下技巧istringstream用于分割带有空格的字符串.
int main() {
string sentence("Cpp is fun");
istringstream in(sentence);
vector<string> vec = vector<string>(istream_iterator<string>(in), istream_iterator<string>());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否有类似的技巧来分割带any分隔符的字符串?例如,|在"Cpp | is | fun"中.
我意识到这个问题可能在过去曾多次被问过,但我会继续不管.
我有一个程序,它将从键盘输入中获取一串数字.数字将始终采用"66 33 9"的形式.基本上,每个数字都用空格分隔,用户输入将始终包含不同数量的数字.
我知道如果每个用户输入的字符串中的数字量不变,使用'sscanf'会有效,但对我来说情况并非如此.另外,因为我是C++的新手,所以我更喜欢处理'字符串'变量而不是字符数组.
我在StackOverflow上调查了一段时间,找到了很好的算法来将带有多个分隔符的字符串拆分成一个vector< string >.我还发现了一些方法:
推动方式:
boost::split(vector, string, boost::is_any_of(" \t"));
Run Code Online (Sandbox Code Playgroud)
的getline方法:
std::stringstream ss(string);
std::string item;
while(std::getline(ss, item, ' ')) {
vector.push_back(item);
}
Run Code Online (Sandbox Code Playgroud)
Boost的标记化方式:
char_separator<char> sep(" \t");
tokenizer<char_separator<char>> tokens(string, sep);
BOOST_FOREACH(string t, tokens)
{
vector.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
和酷STL方式:
istringstream iss(string);
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
back_inserter<vector<string> >(vector));
Run Code Online (Sandbox Code Playgroud)
和Shadow2531的方法(参见链接主题).
他们中的大多数来自这个主题.但不幸的是他们没有解决我的问题:
Boost的分裂很容易使用,但是大数据(在最好的情况下大约1.5*10 ^ 6单个元素)和大约10个分隔符我使用它的可怕的慢.
的getline,STL和Shadow2531的方法有,我只能用一个单个字符作为分隔符的问题.我需要更多.
在速度方面,Boost的标记化更加可怕.用10个分隔符花了11秒钟将一个字符串分成1.5*10 ^ 6个元素.
所以我不知道该怎么做:我希望有一个非常快速的字符串拆分算法和多个分隔符.
Boost的分裂最大还是有办法更快地完成它?
我有一系列字符串存储在一个数组中,由空格分隔(例如['f','o','o','\ 0','b','a','r','\ 0'...]),我需要把它分成一个std::vector<std::string>或类似的.
我可以写一个10行循环来使用std::find或strlen(事实上我刚才这样做),但我想知道是否有更简单/更优雅的方法来做,例如我忽略的一些STL算法,可以哄骗这样做.
这是一个相当简单的任务,如果有一些聪明的STL技巧可以应用于使其更简单,我也不会感到惊讶.
任何接受者?
我想从文本文件中读取图形邻接信息并将其存储到矢量中.
该文件具有任意行数
每一行都有以'\n'结尾的任意整数数
例如,
First line:
0 1 4
Second line:
1 0 4 3 2
Thrid line:
2 1 3
Fourth line:
3 1 2 4
Fifth line:
4 0 1 3
Run Code Online (Sandbox Code Playgroud)
如果我一次使用getline()读取一行,我该如何解析该行(因为每行有可变数量的整数)?
有什么建议?
我试图插入一个由空格分隔的字符串到一个字符串数组,而不使用C++中的vector.例如:
using namespace std;
int main() {
string line = "test one two three.";
string arr[4];
//codes here to put each word in string line into string array arr
for(int i = 0; i < 4; i++) {
cout << arr[i] << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
test
one
two
three.
Run Code Online (Sandbox Code Playgroud)
我知道在C++中已经有很多问题要求字符串>数组.我意识到这可能是一个重复的问题,但我找不到任何满足我条件的答案(将字符串拆分为数组而不使用向量).如果这是一个重复的问题,我会提前道歉.