在for
的{{1}}循环中,迭代器迭代auto
。像这样:
unordered_map
假设所有变量都已正确定义,因为代码工作正常。我的问题是,如何排除第一次迭代?例如,地图包含3行,当前循环迭代为0,1,2。我想仅迭代1和2。
答案 0 :(得分:4)
bool is_first_iteration = true;
for(const auto & rule_pair : rule_index) {
if (std::exchange(is_first_iteration, false)) continue;
std::cout << rule_pair.first << ": ";
printList(rule_pair.second, 0);
std::cout << std::endl;
}
std::exchange
来电将false
分配给is_first_iteration
并返回之前的值。这实际上是the paper proposing std::exchange
for C++14中讨论的用例之一。该论文还展示了一个参考实现,如果您遇到C ++ 11,可以使用它。
答案 1 :(得分:1)
如果你不能使用std :: exchange(由于C ++ 11限制),这个简单的解决方案也可以运行:
bool is_first_iteration = true;
for (const auto & rule_pair : rule_index)
{
if (is_first_iteration)
{
is_first_iteration = false;
continue;
}
std::cout << rule_pair.first << ": ";
printList(rule_pair.second, 0);
std::cout << std::endl;
}
答案 2 :(得分:1)
我有时使用的简洁的C ++ 11选项,它也保留了一个有时候方便的计数器。我在下方if (i++)
显示0
依赖false
转换为true
而其他数字转换为if (++i > 1)
,但您可以size_t i = 0;
for (const auto & rule_pair : rule_index)
if (i++)
{
...
}
如果你对此感觉更舒服:
if (++i == 1) continue;
...或for (const auto & rule_pair : rule_index)
if (&rule_pair != &*std::begin(rule_index))
{
...
}
...如果您愿意......
虽然易于编写,简洁且有时有用,但这些可能不如布尔版本更适合优化 - 如果您愿意,可以使用基准。
另一种有时有用的方法:
var servicesNew = {
readUrl :"",
deleteUrl :"",
updateUrl :"",
createUrl :"",
primaBackbone : function(method, model, options) {
options || (options = {});
var beforeSend = options.beforeSend;
options.beforeSend = function(xhr) {
xhr.setRequestHeader('Authorization','Bearer 52b20db1-4bcb-426e-9bbf-a53a826249f3')
if (beforeSend) return beforeSend.apply(this, arguments);
};
// passing options.url will override
// the default construction of the url in Backbone.sync
switch (method) {
case "read":
options.url = readUrl;
break;
case "delete":
options.url = deleteUrl+'/'+model.get("id");
break;
case "update":
options.url = updateUrl+'/'+model.get("id");
break;
case "create":
options.type = "PUT";
options.url = createUrl;
break;
}
if (options.url)
return Backbone.sync.call(model, method, model, options);
}
}
module.exports = servicesNew;