免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4330 | 回复: 16
打印 上一主题 下一主题

关于stl容器的选择问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-17 23:04 |只看该作者 |倒序浏览
本帖最后由 xb_parasite 于 2011-01-17 23:16 编辑

大家好,我这里有个可能是很简单的问题。


    nItem   Ids                                coordinate(point/rectangle)               type          coordinate_rectangle             bool1     bool2     int1
    0      1232,465,67,8678             (13222,243245)                   AAA         (2374,34)-(123,45345)    true          true   13125
    -1     2348,567,76,878,               (2374,34)-(123,45345)       BBB           (4,34)-(123,45345)       false       false    78908
    -2     324,78,98,80                      (2342,656)-(565,3445)       CCC          (4,34)-(13,45345)        true          true      65879
    1      4059,345,234,24                 (2342,656)-(565,345)        DDD          (2374,4)-(123,45345)    false         true     879
    3     23434,564,76,83,54          (22,656)-(565,3445)           AAA            (23,34)-(123,45345)     false       true       67897
    4    345,345,546,6,57           (2342,656)-(5635,45)            CCC             (24,34)-(123,45345)   true         true        677779
    5   345,34,56,7,7,8                  (42,656)-(565,3445)           DDD             (274,34)-(123,345)     true         true       376389
    2   324,546,7,87,8                     (12231432,345345)              BBB              (8374,34)-(123,9345)  true        true       876846


以下是我的数据样例:

nItem是唯一的。
以上的除nItem以往任何一栏都可能为空值。
数据量并不大,可能只有20行以内。
需要删除交换,移动操作。
我有时需要用type作为键值来取得所有同类型type的数据。
有时我需要只用nItem来取得数据.
有时我只需要取其中的coordinate和 coordinate-rectangle  列而不想要取其他。
有时我只需要取其中Ids列而不需要取其他。
有时我只想要bool1为true的数据。

请问我应该用什么样的容器来做比较好呢?
如果是vector的话,因为我的键值有负数会不适合。
如果我用map的话,因为数据量小感觉有点大才小用。而且用起来比较复杂。

我开始方案是把数据分成了三块:
struct TPOINT
{
int nItem;
int x;
int y;
}
struct TRECT{
int nItem;
int x1;
int y1;
int x2;
int y2;
}
struct TID
{
vector<int> ids;
]
map<int,TPOINT>
map<int,TRECT>
map<int,vector<int>>

..... .....
发现上面的方案特别复杂而且愚蠢!!

我发帖时想到另一个方案:
key=nItem+2;
SHAPE_T
{
int pointContained;
POINT p1;
POINT p2;
}
enum T_TYPE
{
AAA
BBB
CCC
DDD
}
struct DATA
{
int nItem;
vector<int> Ids;
SHAPE_T shape;
T_TYPE type;
SHAPE_T links_rect;
bool bool1;
bool bool2;
int int1;
]
vector<DATA> datas;      (将数据用以key为下标的vector来表示)
但是,如果我这样做的话,该如何处理每项都有可能出现的空值呢?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2011-01-18 09:27 |只看该作者
太乱,看不懂

论坛徽章:
0
3 [报告]
发表于 2011-01-18 09:54 |只看该作者
所有数据包括nitem都封装在一起,然后整个Vector存着

要用就遍历一遍拉倒,哪那么复杂

论坛徽章:
0
4 [报告]
发表于 2011-01-18 09:55 |只看该作者
为什么不考虑用数据库呢?
如果实在不想用数据库 建议用广义表实现吧 你的这种方式确实很乱

论坛徽章:
0
5 [报告]
发表于 2011-01-18 12:49 |只看该作者
太乱,看不懂
hellioncu 发表于 2011-01-18 09:27



不知道怎么把格式整好。我编辑的时候还是好好的,一提交就串行了。


这个问题我发帖的时候就比较犹豫。因为数据量比较小,简单的vector加遍历方式就可以。
但是我又想,如果是数据量大,对查询的效率有要求的话?怎么才能更有效的存储呢。

这里不能用数据库的。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2011-01-18 13:18 |只看该作者
不知道怎么把格式整好。我编辑的时候还是好好的,一提交就串行了。


这个问题我发帖的时候就比较 ...
xb_parasite 发表于 2011-01-18 12:49



    nItem如果取值范围较小,可以加上一个常量做成下标,全部数据用数组存贮在一起即可。
至于用Key访问,如果真有需要,可以另外加一个Key的数组索引,Key->结构指针(或者上述数组中的下标)

论坛徽章:
0
7 [报告]
发表于 2011-01-18 15:11 |只看该作者
你的数据舍不涉及修改添加删除之类的操作?如果修改,那些字段能改?

论坛徽章:
0
8 [报告]
发表于 2011-01-18 17:48 |只看该作者
你的数据舍不涉及修改添加删除之类的操作?如果修改,那些字段能改?
星空天神 发表于 2011-01-18 15:11

需要设计修改和删除,所有字段都涉及修改添加删除。包括nItem。

论坛徽章:
0
9 [报告]
发表于 2011-01-18 20:12 |只看该作者
本帖最后由 xb_parasite 于 2011-01-18 20:27 编辑

不好意思,我问题描述得不够清楚。
实际上,对于上面的 Ids,coordinate(point/rectangle)  , coordinate_rectangle 都还有相应的属性。
以Ids为例,还有color和show的属性:
Ids                                   color                 show
1232,465,67,8678           735873             true

对coordinate(point/rectangle)  , coordinate_rectangle也一样。

顺便问问,编辑帖子旁边写的什么Discuz!代码语法是怎样的啊,我发的这个表格一样的东西总是乱的,想给format一下。

论坛徽章:
0
10 [报告]
发表于 2011-01-18 20:48 |只看该作者
nItem如果取值范围较小,可以加上一个常量做成下标,全部数据用数组存贮在一起即可。
至于用Key ...
hellioncu 发表于 2011-01-18 13:18

嗯,
把每个数据类型都用结构体来表示,每个结构体中都设置一个是否为空的flag.
再用一个大的结构体中放入以上小结构体,大结构体中也设置一个是否为空的flag.
然后用一个定长的数组来装大的结构体。数据下标用(nItem+一个整数)来表示。

如果指定nItem查找就可以直接得到对应数据。
如果以其它数据类型作为条件来查找的话就遍历数组来实现。因为数据量小这样没问题。

如果数据量大呢?
我觉得可以这样分别以需要的类型做多个索引,分别以map来实现?
比如:
以Type为Key排序来索引数据结构体指针。map<Type,vector<struct DATA*>>
以bool1为Key排序来索引数据结构体指针。map<bool1,vector<struct DATA*>>
...

这样可以吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP