Simplify OrderedGroups using C++11 syntax

Change-Id: I3e50bb66c43245df979a471622957fd01e73d014
diff --git a/include/ceres/ordered_groups.h b/include/ceres/ordered_groups.h
index 3ff459e..0bff41f 100644
--- a/include/ceres/ordered_groups.h
+++ b/include/ceres/ordered_groups.h
@@ -33,6 +33,7 @@
 
 #include <map>
 #include <set>
+#include <unordered_map>
 #include <vector>
 #include "ceres/internal/port.h"
 #include "glog/logging.h"
@@ -63,8 +64,7 @@
       return false;
     }
 
-    typename std::map<T, int>::const_iterator it =
-        element_to_group_.find(element);
+    auto it = element_to_group_.find(element);
     if (it != element_to_group_.end()) {
       if (it->second == group) {
         // Element is already in the right group, nothing to do.
@@ -126,17 +126,14 @@
       return;
     }
 
-    typename std::map<int, std::set<T>>::reverse_iterator it =
-        group_to_elements_.rbegin();
+    auto it = group_to_elements_.rbegin();
     std::map<int, std::set<T>> new_group_to_elements;
     new_group_to_elements[it->first] = it->second;
 
     int new_group_id = it->first + 1;
     for (++it; it != group_to_elements_.rend(); ++it) {
-      for (typename std::set<T>::const_iterator element_it = it->second.begin();
-           element_it != it->second.end();
-           ++element_it) {
-        element_to_group_[*element_it] = new_group_id;
+      for (const auto& element : it->second) {
+        element_to_group_[element] = new_group_id;
       }
       new_group_to_elements[new_group_id] = it->second;
       new_group_id++;
@@ -148,8 +145,7 @@
   // Return the group id for the element. If the element is not a
   // member of any group, return -1.
   int GroupId(const T element) const {
-    typename std::map<T, int>::const_iterator it =
-        element_to_group_.find(element);
+    auto it = element_to_group_.find(element);
     if (it == element_to_group_.end()) {
       return -1;
     }
@@ -157,16 +153,14 @@
   }
 
   bool IsMember(const T element) const {
-    typename std::map<T, int>::const_iterator it =
-        element_to_group_.find(element);
+    auto it = element_to_group_.find(element);
     return (it != element_to_group_.end());
   }
 
   // This function always succeeds, i.e., implicitly there exists a
   // group for every integer.
   int GroupSize(const int group) const {
-    typename std::map<int, std::set<T>>::const_iterator it =
-        group_to_elements_.find(group);
+    auto it = group_to_elements_.find(group);
     return (it ==  group_to_elements_.end()) ? 0 : it->second.size();
   }
 
@@ -197,7 +191,7 @@
 
  private:
   std::map<int, std::set<T>> group_to_elements_;
-  std::map<T, int> element_to_group_;
+  std::unordered_map<T, int> element_to_group_;
 };
 
 // Typedef for the most commonly used version of OrderedGroups.