【发布时间】:2010-06-15 15:42:30
【问题描述】:
仅供参考:没有提升,是的,它有这个,我想要重新发明轮子;)
C++ 中是否存在某种形式的选择性迭代器(可能)?我想要的是像这样分隔字符串:
some:word{or other
变成这样的形式:
some : word { or other
我可以通过两个循环和 find_first_of(":") 和 ("{") 来做到这一点,但这对我来说似乎(非常)低效。我认为也许有一种方法可以创建/定义/编写一个迭代器,该迭代器将使用 for_each 迭代所有这些值。我担心这会让我为 std::string 编写一个成熟的自定义方式过于复杂的迭代器类。
所以我想也许可以这样做:
std::vector<size_t> list;
size_t index = mystring.find(":");
while( index != std::string::npos )
{
list.push_back(index);
index = mystring.find(":", list.back());
}
std::for_each(list.begin(), list.end(), addSpaces(mystring));
这对我来说看起来很乱,我很确定存在一种更优雅的方法。但我想不出来。有人有一个好主意吗?谢谢
PS:我没有测试发布的代码,只是快速写下我会尝试的内容
更新:在考虑了你所有的答案之后,我想出了这个,它很合我的胃口:)。这确实假设最后一个字符是换行符或其他字符,否则结尾 {、} 或 : 将不会得到处理。
void tokenize( string &line )
{
char oneBack = ' ';
char twoBack = ' ';
char current = ' ';
size_t length = line.size();
for( size_t index = 0; index<length; ++index )
{
twoBack = oneBack;
oneBack = current;
current = line.at( index );
if( isSpecial(oneBack) )
{
if( !isspace(twoBack) ) // insert before
{
line.insert(index-1, " ");
++index;
++length;
}
if( !isspace(current) ) // insert after
{
line.insert(index, " ");
++index;
++length;
}
}
}
一如既往地欢迎评论:)
【问题讨论】:
-
“C++ 中是否存在某种形式的选择性迭代器(可能)?”好吧,据你说,Boost 有这个。也许我很迂腐,但如果你在引用一个可能的例子后立即问某事是否可能,我会认为你的问题有点愚蠢。您可能会发现阅读 Boost 实现的源代码以了解他们是如何做到的很有启发性。即使您想重新发明它,我相信 Boost 也会提供一些关于如何正确操作的提示。
-
“我担心这会让我编写一个成熟的自定义方式过于复杂的迭代器类” ... Boost 有它的迭代器实用程序正是因为编写你自己的迭代器很烦人。
标签: c++ algorithm stl iterator find