跳过unordered_map的第一次迭代

时间:2015-05-12 05:44:59

标签: c++ c++11 auto unordered-map

for的{​​{1}}循环中,迭代器迭代auto。像这样:

unordered_map

假设所有变量都已正确定义,因为代码工作正常。我的问题是,如何排除第一次迭代?例如,地图包含3行,当前循环迭代为0,1,2。我想仅迭代1和2。

3 个答案:

答案 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;