网站首页 文章专栏 操作原始数组的工具类
操作原始数组的工具类
编辑时间:2019-03-13 10:22:53 作者:code_liu 10条评论


    出自:purecpp

    地址: www.purecpp.org

    转载请注明出处!


来说两句吧
登录才能发表评论。
最新评论
  • qicosmos
    qicosmos 2019-03-13 09:01:55
    c++17 的std::string_view可以满足你的需求。
  • qicosmos
    qicosmos 2019-03-13 09:50:45

    你的想法是想对string_view做一个泛化,不仅仅是对char*的view,而是对一个泛型T*的试图吗?

    不太清楚你这个需求的场景,对于string_view之所以采用view是因为要避免之前操作string时产生的临时变量,可以提高效率。
    你这个array_view是出于什么考虑?

  • qicosmos
    code_liu 2019-03-13 09:55:22
    我不只是想要一个array的试图。我还想通过这个“视图”对数据进行追加、删除操作,其实就是想要托管原始数组,提供更好操作的接口。
  • qicosmos
    qicosmos 2019-03-13 09:59:43

    容器不满足你的需求吗?
    你这种追加删除之类的有提高性能吗?

  • qicosmos
    code_liu 2019-03-13 10:09:00


    之前操作原始数据,如果我想添加一个item或许代码是这样:

    Info *add_item = nullptr;
    if (infos_used_len < 10) { // 10是定义数组是的容量
        add_item = infos + infos_used_len;
        infos_used_len++;
    }
    
    if (add_item) {
        // use 
    }
    

    或者遍历

    for (size_t i = 0 ;i < 10 && i < infos_uesd_len; i++) {
        // infos[i] ...
    }
    

    现在可以这样操作 

    添加

    auto view = make_view(infos, infos_used_len);
    auto add_item = view.add();
    if (add_item) {
        // use
    }

    遍历

    auto view = make_view(infos, infos_used_len);
    for (auto &item : view) {
        // item ...
    }

  • qicosmos
    code_liu 2019-03-13 10:12:26
    我是说必须使用原始数组的时候。
  • qicosmos
    qicosmos 2019-03-13 10:15:59

    那这个不能算作view的,view是视图,它永远不会去修改或删除原始的数据。

    你这个只能算作一个工具类,不能称之为视图。

  • qicosmos
    code_liu 2019-03-13 10:17:07

    我们项目中有将protobuf的定义的结构解析成c++中的类。里面的repeated转成了原始数组。而且有很多业务已经直接操作了数组,再去改成容器,比较麻烦。无奈只能继续操作数组。

    比如被生成了这样类


    /*/ @pbp_sentry*/
    struct MRoleGameInfo
    {
    uint32_t sentry_data_begin_;
    MGameCurGame cur_game;
    uint32_t prop_list_num;
    int32_t prop_list[MAX_PROP_LEN]; // 数组
    uint32_t weapon_list_num;
    MWeaponInfo weapon_list[MAX_WEAPON_LEN]; // 数组
    uint32_t normal_game_info_num;
    MGameResultStatInfo normal_game_info[MAX_GAME_MODE_LEN]; // 数组
    uint32_t sentry_data_end_;
    MRoleGameInfo();
    void Clear();
    bool FromPb(const proto::PbRoleGameInfo *pf);
    bool ToPb(proto::PbRoleGameInfo *pf) const;
    bool SentryCheck() const;
    };


  • qicosmos
    code_liu 2019-03-13 10:18:06
    好像是不应该叫view
  • qicosmos
    zming 2019-03-14 16:03:10
    20的span   gsl中也有了
Absolutely

purecpp

一个很酷的modern c++开源社区


这里有创新的idea,这里有最酷的modern c++代码,这里有很棒的modern c++开源项目。purecpp社区邮箱 purecpp@163.com
友情链接