Changes in lemon/maps.h [768:99124ea4f048:741:71939d63ae77] in lemon
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/maps.h
r768 r741 1826 1826 /// the items stored in the graph, which is returned by the \c id() 1827 1827 /// function of the graph. This map can be inverted with its member 1828 /// class \c InverseMap or with the \c operator() ()member.1828 /// class \c InverseMap or with the \c operator() member. 1829 1829 /// 1830 1830 /// \tparam GR The graph type. … … 1902 1902 1903 1903 /// This class provides simple invertable graph maps. 1904 /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap) 1905 /// and if a key is set to a new value, then stores it in the inverse map. 1904 /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap" 1905 /// and if a key is set to a new value then store it 1906 /// in the inverse map. 1906 1907 /// The values of the map can be accessed 1907 1908 /// with stl compatible forward iterator. 1908 1909 /// 1909 1910 /// This type is not reference map, so it cannot be modified with 1910 /// the subscript operator.1911 /// the subscription operator. 1911 1912 /// 1912 1913 /// \tparam GR The graph type. … … 1924 1925 template Map<V>::Type Map; 1925 1926 1926 typedef std::m ultimap<V, K> Container;1927 typedef std::map<V, K> Container; 1927 1928 Container _inv_map; 1928 1929 … … 1949 1950 /// iterator on the values of the map. The values can 1950 1951 /// be accessed in the <tt>[beginValue, endValue)</tt> range. 1951 /// They are considered with multiplicity, so each value is1952 /// traversed for each item it is assigned to.1953 1952 class ValueIterator 1954 1953 : public std::iterator<std::forward_iterator_tag, Value> { … … 2003 2002 void set(const Key& key, const Value& val) { 2004 2003 Value oldval = Map::operator[](key); 2005 typename Container::iterator it; 2006 for (it = _inv_map.equal_range(oldval).first; 2007 it != _inv_map.equal_range(oldval).second; ++it) { 2008 if (it->second == key) { 2009 _inv_map.erase(it); 2010 break; 2011 } 2004 typename Container::iterator it = _inv_map.find(oldval); 2005 if (it != _inv_map.end() && it->second == key) { 2006 _inv_map.erase(it); 2012 2007 } 2013 2008 _inv_map.insert(std::make_pair(val, key)); … … 2023 2018 } 2024 2019 2025 /// \brief Gives back an item by its value. 2026 /// 2027 /// This function gives back an item that is assigned to 2028 /// the given value or \c INVALID if no such item exists. 2029 /// If there are more items with the same associated value, 2030 /// only one of them is returned. 2031 Key operator()(const Value& val) const { 2032 typename Container::const_iterator it = _inv_map.find(val); 2020 /// \brief Gives back the item by its value. 2021 /// 2022 /// Gives back the item by its value. 2023 Key operator()(const Value& key) const { 2024 typename Container::const_iterator it = _inv_map.find(key); 2033 2025 return it != _inv_map.end() ? it->second : INVALID; 2034 }2035 2036 /// \brief Returns the number of items with the given value.2037 ///2038 /// This function returns the number of items with the given value2039 /// associated with it.2040 int count(const Value &val) const {2041 return _inv_map.count(val);2042 2026 } 2043 2027 … … 2050 2034 virtual void erase(const Key& key) { 2051 2035 Value val = Map::operator[](key); 2052 typename Container::iterator it; 2053 for (it = _inv_map.equal_range(val).first; 2054 it != _inv_map.equal_range(val).second; ++it) { 2055 if (it->second == key) { 2056 _inv_map.erase(it); 2057 break; 2058 } 2036 typename Container::iterator it = _inv_map.find(val); 2037 if (it != _inv_map.end() && it->second == key) { 2038 _inv_map.erase(it); 2059 2039 } 2060 2040 Map::erase(key); … … 2068 2048 for (int i = 0; i < int(keys.size()); ++i) { 2069 2049 Value val = Map::operator[](keys[i]); 2070 typename Container::iterator it; 2071 for (it = _inv_map.equal_range(val).first; 2072 it != _inv_map.equal_range(val).second; ++it) { 2073 if (it->second == keys[i]) { 2074 _inv_map.erase(it); 2075 break; 2076 } 2050 typename Container::iterator it = _inv_map.find(val); 2051 if (it != _inv_map.end() && it->second == keys[i]) { 2052 _inv_map.erase(it); 2077 2053 } 2078 2054 } … … 2110 2086 /// \brief Subscript operator. 2111 2087 /// 2112 /// Subscript operator. It gives back an item 2113 /// that is assigned to the given value or \c INVALID 2114 /// if no such item exists. 2088 /// Subscript operator. It gives back the item 2089 /// that was last assigned to the given value. 2115 2090 Value operator[](const Key& key) const { 2116 2091 return _inverted(key); … … 2130 2105 }; 2131 2106 2132 /// \brief Provides continuous and unique idfor the2107 /// \brief Provides continuous and unique ID for the 2133 2108 /// items of a graph. 2134 2109 /// 2135 2110 /// RangeIdMap provides a unique and continuous 2136 /// idfor each item of a given type (\c Node, \c Arc or2111 /// ID for each item of a given type (\c Node, \c Arc or 2137 2112 /// \c Edge) in a graph. This id is 2138 2113 /// - \b unique: different items get different ids, … … 2145 2120 /// the \c id() function of the graph or \ref IdMap. 2146 2121 /// This map can be inverted with its member class \c InverseMap, 2147 /// or with the \c operator() ()member.2122 /// or with the \c operator() member. 2148 2123 /// 2149 2124 /// \tparam GR The graph type.
Note: See TracChangeset
for help on using the changeset viewer.