#include <map> struct Storage { // ... something using Data = std::map<int, double>; Data data; // ... something };
void Fill(Storage &storage) { int i; for ( i = 0; i < 5; ++i ) { storage.data.insert( {i, i} ); } } int main() { Storage data1, data2; Fill(data1); Fill(data2); return 0; }
#include <map> #include <iostream> struct Storage { // ... something using Data = std::map<int, double>; Data data; enum Type { forward, reverse }; const Type type; Storage() = delete; Storage(Type initType) : type(initType) {}; // ... something }; void Fill(Storage &storage) { int i; for ( i = 0; i < 5; ++i ) { storage.data.insert( {i, i} ); } } std::ostream& operator<<(std::ostream &stream, const Storage &storage) { if ( storage.type == Storage::forward ) // for (const auto &iter : storage.data) stream << std::endl << iter.first << " " << iter.second; else // for (auto iter = storage.data.crbegin(); iter != storage.data.crend(); ++iter) stream << std::endl << iter->first << " " << iter->second; return stream; } int main() { Storage data1(Storage::forward), data2(Storage::reverse); Fill(data1); Fill(data2); std::cout << data1 << std::endl << data2 << std::endl; return 0; }
#include <map> #include <iostream> #include <functional> enum Type { ascending, descending }; struct StorageAncestor { // ... something }; template<Type T> struct Storage : StorageAncestor { }; template<> struct Storage<ascending> { using Data = std::map<int, double, std::less<int>>; Data data; }; template<> struct Storage<descending> { using Data = std::map<int, double, std::greater<int>>; Data data; }; template<Type T> void Fill(Storage<T> &storage) { int i; for ( i = 0; i < 5; ++i ) { storage.data.insert( {i, i} ); } } template<Type T> std::ostream& operator<<(std::ostream &stream, const Storage<T> &storage) { // for (const auto &iter : storage.data) stream << std::endl << iter.first << " " << iter.second; return stream; } int main() { Storage<ascending> data1; Storage<descending> data2; Fill(data1); Fill(data2); std::cout << data1 << std::endl << data2 << std::endl; return 0; }
#include <map> #include <iostream> enum Type { ascending, descending }; template<typename T> class FraudulentValue { public: FraudulentValue(const T &t, Type initType) : m_value(t), m_type(initType) {}; bool operator< (const FraudulentValue<T> &comp) const { return (m_type == ascending) ? (m_value < comp.m_value) : (m_value > comp.m_value); }; operator T() const {return m_value;}; protected: T m_value; Type m_type; FraudulentValue() = delete; }; struct Storage { // ... something using Data = std::map<FraudulentValue<int>, double>; Data data; const Type type; Storage() = delete; Storage(Type initType) : type(initType) {}; // ... something }; void Fill(Storage &storage) { int i; for ( i = 0; i < 5; ++i ) { storage.data.insert( {FraudulentValue<int>(i, storage.type), i} ); } } std::ostream& operator<<(std::ostream &stream, const Storage &storage) { // for (const auto &iter : storage.data) stream << std::endl << iter.first << " " << iter.second; return stream; } int main() { Storage data1(ascending), data2(descending); Fill(data1); Fill(data2); std::cout << data1 << std::endl << data2 << std::endl; return 0; }
#include <map> #include <iostream> #include <functional> struct Storage { // ... something using Data = std::map<int, double>; Data data; enum Type { forward, reverse }; const Type type; Storage() = delete; Storage(Type initType) : type(initType) {}; using const_functor = std::function<void(const Data::value_type&)> const; void for_each(const_functor &functor) const { if ( type == Storage::forward ) // for (auto &iter : data) functor(iter); else // for (auto iter = data.crbegin(); iter != data.crend(); ++iter) functor(*iter); }; // ... something }; void Fill(Storage &storage) { int i; for ( i = 0; i < 5; ++i ) { storage.data.insert( {i, i} ); } } std::ostream& operator<<(std::ostream &stream, const Storage &storage) { storage.for_each([&](const Storage::Data::value_type &value) { stream << std::endl << value.first << " " << value.second; } ); return stream; } int main() { Storage data1(Storage::forward), data2(Storage::reverse); Fill(data1); Fill(data2); std::cout << data1 << std::endl << data2 << std::endl; return 0; }
#include <map> #include <iostream> enum SortingType { ascending, descending }; enum CompareType { none, less, greater }; template<typename T> class AdjustableCompare { public: AdjustableCompare() : m_type(none) {}; bool operator()(const T &_Left, const T &_Right) { if ( m_type == less ) return (_Left < _Right); if ( m_type == greater ) return (_Left > _Right); throw std::runtime_error("AdjustableCompare was not initialized"); }; void setTypeOnce(CompareType type) { if ( m_type != none ) throw std::runtime_error("AdjustableCompare double set"); m_type = type; }; private: CompareType m_type; }; struct Storage { // ... something using Data = std::map<int, double, AdjustableCompare<int>>; Data data; Storage() = delete; Storage(SortingType initType) { data._Getcomp().setTypeOnce( (initType == ascending) ? less : greater ); }; // ... something }; void Fill(Storage &storage) { int i; for ( i = 0; i < 5; ++i ) { storage.data.insert( {i, i} ); } } std::ostream& operator<<(std::ostream &stream, const Storage &storage) { // for (const auto &iter : storage.data) stream << std::endl << iter.first << " " << iter.second; return stream; } int main() { Storage data1(ascending), data2(descending); Fill(data1); Fill(data2); std::cout << data1 << std::endl << data2 << std::endl; return 0; }
#include <map> #include <iostream> #include <memory> enum SortingType { ascending, descending }; enum CompareType { none, less, greater }; template<typename T> class TrickyCompare { public: TrickyCompare() : m_type(new CompareType(none)) {}; bool operator()(const T &_Left, const T &_Right) { if ( *m_type == less ) return (_Left < _Right); if ( *m_type == greater ) return (_Left > _Right); throw std::runtime_error("TrickyCompare was not initialized"); }; void setTypeOnce(CompareType type) { if ( *m_type != none ) throw std::runtime_error("TrickyCompare double set"); *m_type = type; }; private: std::shared_ptr<CompareType> m_type; }; struct Storage { // ... something using Data = std::map<int, double, TrickyCompare<int>>; Data data; Storage() = delete; Storage(SortingType initType) { data.key_comp().setTypeOnce( (initType == ascending) ? less : greater ); }; // ... something }; void Fill(Storage &storage) { int i; for ( i = 0; i < 5; ++i ) { storage.data.insert( {i, i} ); } } std::ostream& operator<<(std::ostream &stream, const Storage &storage) { // for (const auto &iter : storage.data) stream << std::endl << iter.first << " " << iter.second; return stream; } int main() { Storage data1(ascending), data2(descending); Fill(data1); Fill(data2); std::cout << data1 << std::endl << data2 << std::endl; return 0; }
#include <map> #include <iostream> #include <memory> template<typename T> class Compare { public: enum Type { less, greater }; Compare() = delete; Compare(Type type) : m_type(type) {}; bool operator()(const T &_Left, const T &_Right) const { if ( m_type == less ) return (_Left < _Right); else return (_Left > _Right); }; private: Type m_type; }; struct Storage { // ... something using Data = std::map<int, double, Compare<int>>; Data data; enum Type { ascending, descending }; Storage() = delete; Storage(Type initType) : data((initType == ascending) ? Compare<int>::less : Compare<int>::greater) {}; // ... something }; void Fill(Storage &storage) { int i; for ( i = 0; i < 5; ++i ) { storage.data.insert( {i, i} ); } } std::ostream& operator<<(std::ostream &stream, const Storage &storage) { // for (const auto &iter : storage.data) stream << std::endl << iter.first << " " << iter.second; return stream; } int main() { Storage data1(Storage::ascending), data2(Storage::descending); Fill(data1); Fill(data2); std::cout << data1 << std::endl << data2 << std::endl; return 0; }
Source: https://habr.com/ru/post/319252/
All Articles