Giter Site home page Giter Site logo

Comments (6)

gasparfm avatar gasparfm commented on May 11, 2024

Haven't tested, but I think you can use std::unordered_map instead of std::map in the object typedef json11.hpp

from json11.

artwyman avatar artwyman commented on May 11, 2024

Doing that would avoid the alphabetical sort, but wouldn't preserve insertion order as you mention. Hashes have an undefined iteration order. If you want both fast lookup, and insertion-order iteration, you need a hybrid structure like a linked hash (http://www.drdobbs.com/cpp/an-stl-compatible-hybrid-of-linked-list/184406207). STL doesn't include such a datastructure.

from json11.

alecava avatar alecava commented on May 11, 2024

Thank you guys for you replies, I think I will try to use boost::multi_index_container it offers al the features I need

from json11.

rianhunter avatar rianhunter commented on May 11, 2024

I think there is a way to do this by using the Compare parameter when instantiating the std::map template. You'd have to tag each inserted object with a "insert order" index, though, either using std::pair or something custom.

from json11.

artwyman avatar artwyman commented on May 11, 2024

@rianhunter I believe if you do that then you'd need to know the insertion order at the time of the lookup in order to construct an appropriate key with which to find an entry, otherwise it would never actually be equal. I'm willing to be proven wrong with sample code, though. :)

from json11.

rianhunter avatar rianhunter commented on May 11, 2024

@artwyman Oops, good point, the Compare is on the key not the value. You can hack it using multiple maps though e.g.

class Json final {
public:
  class object final {
    typedef int insert_order_t;
    typedef std::pair<insert_order_t, std::string> map_key_type;

    struct MapKeyCompare {
      bool operator()(const map_key_type & lhs, const map_key_type & rhs) const {
         return std::less<insert_order_t>(lhs.first, rhs.first);
      }
    };

    insert_order_t _cur_insert_order = 1;
    std::map< map_key_type, Json, MapKeyCompare> _map;
    std::unordered_map<std::string, insert_order_t> _map_2;

  public:
    /* ... constructors, other std::map-like methods etc. */

    T& operator[](const std::string & key) {
      auto & insert_order_of_key = _map_2[key];
      if (!insert_order_of_key) {
        // key doesn't exist in map
        insert_order_of_key =  _cur_insert_order++;
      }
      return _map[std::make_pair(insert_order_of_key, key)];
    }
  };
};

Bookkeeping isn't too hard with this method since everything is still key'd off the original key. You do pay some extra space costs though it pays back in relative simplicity / code reuse.

btw congrats to your team on http://github.com/dropbox/djinni :)

from json11.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.