我试图迭代一组对象并创建一个逗号分隔的名称字符串.代码的注释部分只有在它不是集合中的最后一个时才会添加逗号,但它会生成以下错误:
错误:'operator + ='不匹配(操作数类型为'std :: _ Rb_tree_const_iterator'和'long int')_M_current + = -__ n;
如果我使用向量而不是集合,它工作正常.我究竟做错了什么?
std::string paramList = "";
std::set<Param>::iterator end = params.end();
for (std::set<Param>::iterator it = params.begin(); it != end; ++it) {
paramList += (*it).name;
/*if (it != end -1) {
paramList += ",";
}*/
}
Run Code Online (Sandbox Code Playgroud)
只有某些类别的迭代器允许您直接执行任意算术,例如end-1.
集合的迭代器允许一次向前和向后一步,使用it++和it--.确实,it - 1仍然只遍历一个步骤,但规则更通用(语言不知道你提供的整数是公正的1,没有理由做出特殊情况比较,比方说42).
可以使用std::next/ std::prev来获取此行为.这是故意更冗长,以阻止你对迭代器进行任意算术,这对于这种迭代器而言比对于像矢量这样的类似数组的简单事物来说更昂贵.
在这种情况下,std::prev(end)将为您工作,并合理地说是惯用的.
但是,如果您发现自己编写类似内容std::next(it, 42),则可能需要考虑改进算法或使用其他容器.
同样,这种限制的目的是鼓励这种思考.
编写算法的另一种方法可能是:
std::string paramList;
std::set<Param>::iterator begin = params.begin(), end = params.end();
for (std::set<Param>::iterator it = begin; it != end; ++it) {
if (it != begin)
paramList += ",";
paramList += (*it).name;
}
Run Code Online (Sandbox Code Playgroud)
注意我是如何翻转逻辑的,以避免需要进行任何算术运算.
我实际上通常使用一个bool标志(当我paramList是一个字符串流时)或者只是总是追加一个,然后缩小paramList一个(当它是一个字符串时)如果params非空.
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |