防止循环内外的代码重复
Preventing code duplication in and outside of a loop
我有一个问题重写循环:
else if( "d" == option || "debug" == option )
{
debug(debug::always) << "commandline::set_internal_option::setting debug options: "
<< value << ".n";
string::size_type index = 0;
do
{
const string::size_type previous_index = index+1;
index=value.find( ',', index );
const string item = value.substr(previous_index, index);
debug::type item_enum;
if( !map_value(lib::debug_map, item, item_enum) )
throw lib::commandline_error( "Unknown debug type: " + item, argument_number );
debug(debug::always) << "commandline::set_internal_option::enabling " << item
<< " debug output.n";
debug(debug::always) << "n-->s_level=" << debug::s_level << "n";
debug::s_level = static_cast<debug::type>(debug::s_level ^ item_enum);
debug(debug::always) << "n-->s_level=" << debug::s_level << "n";
} while( index != string::npos );
}
value
类似于string("commandline,parser")
,问题是在第一次运行时,我需要substr(previous_index, index)
,但在随后的每次迭代中,我需要substr(previous_index+1, index)
跳过逗号。是否有一些我忽略的简单方法,或者我必须在初始迭代的循环之外重复对find
的调用?
既然您的目标是防止代码重复:
std::vector<std::string> v;
boost::split(v, value, [](char c) { c == ','; });
如果你想创建自己的split函数,你可以这样做:
template<typename PredicateT>
std::vector<std::string> Split(const std::string & in, PredicateT p)
{
std::vector<std::string> v;
auto b = in.begin();
auto e = b;
do {
e = std::find_if(b, in.end(), p);
v.emplace_back(b,e);
b = e + 1;
} while (e != in.end());
return v;
}
取substr
后为什么不更新previous_index
呢?
string::size_type index = 0;
string::size_type previous_index = 0;
do {
index=value.find( ',', previous_index );
const string item = value.substr(previous_index, index);
previous_index = index+1;
} while( index != string::npos );
未选中,但这应该可以达到目的(只需要多一个单词的内存)。
从-1
开始?
string::size_type index = -1;
do
{
const string::size_type previous_index = index + 1;
index=value.find(',', previous_index);
const string item = value.substr(previous_index, index - previous_index);
} while( index != string::npos );
一个愚蠢的(有点难以读懂的)解决方案是这样的:
string::size_type once = 0;
/* ... */
const string::size_type previous_index = index+1 + (once++ != 0); // or !!once
首先,我认为有一个小错误:
在你的代码中,表达式index=value.find( ',', index );
不会改变index
的值,如果它已经是字符串中逗号字符的索引(除了第一次循环迭代之外,总是这种情况)。
所以你可能想用while( index++ != string::npos );
代替while( index != string::npos );
,用previous_index = index
代替previous_index = index+1
。
这应该也能解决你原来的问题。
澄清:
string::size_type index = 0;
do
{
const string::size_type previous_index = index;
index = value.find( ',', index );
const string item = value.substr(previous_index, index - previous_index);
} while( index++ != string::npos );
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在这个代码结束循环中没有得到结束
- 下面是我为检测链接列表中的循环而制作的代码
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 在java中解决这段代码时面临循环中的问题
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 我的代码运行良好,但在游戏循环中中断
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 如何编译使用循环引用的代码?
- 我正在尝试创建一个菜单,但我的代码一直在循环
- 使用基于数组和范围的 For 循环替换一些基本代码行
- 在C/C 中使用检查功能的Windows NT命令行代码循环
- 我想不出一种方法来使我的代码循环
- 使用 SIMD 管理累积(单个)值的清理代码循环的方法是什么
- 我如何让我的部分代码循环并重复一个问题,直到答案是有效的输入C++
- C 代码循环问题
- 如何仅使用if-else语句(no-for、do/while等)使此代码循环一定次数?(c++)
- 如何运行代码循环 if (a==b) 并且不循环如果 a != b 没有"else"
- 用相同的代码循环遍历对象和指针
- 如何使我的代码循环(与arduino)