在C / C ++中列出项目的最有效方法

时间:2008-11-09 14:22:48

标签: c++ c

我有100个未分类商品的清单。每个项目属于一个组。该项所属的组只是项类的成员。

使用C / C ++我正在寻找最有效的扫描项目列表的方法,检查它们所在的组并将项目打印到屏幕上。这是抓住了。将一个组中的项目打印到屏幕后,我不想再打印属于该组的项目。

我正在使用pre STL编译器,并且可执行文件的大小很重要,所以我不想开始定义自己的Hash类。

8 个答案:

答案 0 :(得分:6)

根据组值对项目进行排序(如果它是指针,那么您可以使用其地址,否则词典字符串进行排序) 。然后遍历该排序列表,始终获取每个组的第一项。

大概需要

n + n * log(n)

我认为这是可执行文件大小和速度之间的合理选择。

答案 1 :(得分:1)

你可以创建一个组的字典/散列图,并为每个组存储一个bool,说明是否打印了该组的项目。

示例代码:

#include <unordered_map>
#include <string>
#include <iostream>

std::string getGroupForNumber( int num )
{
//
}

int main()
{
    typedef std::tr1::unordered_map< std::string, bool > hashmap;
    hashmap groupsPrinted;

    for( int i = 0 ; i < 100 ; ++i ) {
        if ( groupsPrinted[ getGroupForNumber( i ) ] == false ) {
            groupsPrinted[ getGroupForNumber( i ) ] = true;
            std::cout << i << std::endl;
        }
    }
    return 0;
}

答案 2 :(得分:1)

你在问题​​中写了c / c ++,所以这里有一些c代码。 有几个问题是有道理的。 一个组在将来的某个时候是否可以打印? 项目列表是静态的吗? 您打印的特定组中的哪个项目是否重要?

我会建议以下构造(我对问题的理解有限):

一系列清单。

  typedef struct node{
    void *item; /* this is your item */
    node *next; 
  } node_t;

  typedef struct {
    node_t *my_group;
    int used;
  } group_t;

  static group_t my_items[NUM_OF_GROUPS]; /* this is your ordered by groups list.*/

更好的是,使用列表列表。 group_t将是:

typedef struct group{
  node_t *my_group;
  group *next_free;
} group_t;

答案 3 :(得分:0)

如果您可以对组0..99进行编号,那么您需要一组布尔值,或者如果您想要优化,则需要bitset。 将所有数组初始化为'false'。 打印后设置arr [groupId] ='true',然后在打印前检查下一次的值。不需要STL。

答案 4 :(得分:0)

保留一组std ::组的名称,不应再打印其中的项目。

答案 5 :(得分:0)

回答更多问题。

  

项目列表是静态的吗?

不,它可以随时缩小或增长。

  

来自哪个项目是否重要?   您打印的特定组?

不是暂时的,没有。也许在将来,但目前应该足以打印属于一个独特组的第一个项目。

答案 6 :(得分:0)

团体怎么样?你能得到一个新的团体吗?在打印其中一个成员后,一个小组是否可以变得相关?

答案 7 :(得分:0)

打印到屏幕的成本比使用对象可以执行的任何操作都要高几个数量级。如果只有少数几个组中有1000万个对象的数组,那么排序不是一个合理的选择。如果可以通过静态索引(即给定范围内的整数)来标识组,则只需使用掩码数组来指示是否已经看到它。如果组更复杂,您可以存储在任何集合数据结构(哈希,树等)中看到的组。