小编use*_*554的帖子

通过索引进行快速搜索,并在C++中保持插入顺序

我需要一个能够快速搜索超过100万件物品并保持插入顺序的容器.

所以首先我想到了std :: map,但它并不关心它根据键对数据进行排序的插入顺序.我找到了boost :: multi_index,它将保留插入顺序并通过索引字段快速搜索数据(对于我的情况,这是id(不唯一!)).所以我做了类似的事情:

struct myData
{
    unsigned long id;
    unsigned long insertionOrder;

    myData (){};
    myData (unsigned long id_,unsigned long insertionOrder_):id(id_), insertionOrder(insertionOrder _)){}
    ~ myData (){};
};


typedef multi_index_container<
    myData, 
        indexed_by<    
            random_access<>,  // keep insertion order
            ordered_non_unique< member< myData, unsigned long, & myData::id> >
        > 
> myDataContainerType;
Run Code Online (Sandbox Code Playgroud)

我可以毫无问题地将数据推送到容器中.假设我将5个项目插入到我的容器中,如:

myDataContainer.push_back(myData(1002, 1));
myDataContainer.push_back(myData(1001, 2));
myDataContainer.push_back(myData(1005, 3));
myDataContainer.push_back(myData(1003, 4));
myDataContainer.push_back(myData(1000, 5));
Run Code Online (Sandbox Code Playgroud)

问题是当我在容器中搜索项目“1001”iterator++返回"1002"iterator—返回时"1000".所以它似乎并不关心插入顺序,也根据索引值对数据进行排序.

我希望结果为iterator++:“1002”和for iterator--: …

c++ search containers boost boost-multi-index

7
推荐指数
1
解决办法
372
查看次数

c ++中不规则的文件写入性能

我正在编写一个应用程序,它通过简单的函数调用接收二进制数据流,例如put(DataBLock, dateTime);每个数据包为4 MB

我必须将这些数据块写成单独的文件,以备将来使用时使用一些额外的数据,如id,插入时间,标签等...

所以我都尝试了这两种方法:

首先FILE:

data.id = seedFileId; 
seedFileId++;

std::string fileName = getFileName(data.id);

char *fNameArray = (char*)fileName.c_str(); 
FILE* pFile;
pFile = fopen(fNameArray,"wb");

fwrite(reinterpret_cast<const char *>(&data.dataTime), 1, sizeof(data.dataTime), pFile);        
data.dataInsertionTime = time(0);
fwrite(reinterpret_cast<const char *>(&data.dataInsertionTime), 1, sizeof(data.dataInsertionTime), pFile);
fwrite(reinterpret_cast<const char *>(&data.id), 1, sizeof(long), pFile);
fwrite(reinterpret_cast<const char *>(&data.tag), 1, sizeof(data.tag), pFile);
fwrite(reinterpret_cast<const char *>(&data.data_block[0]), 1, data.data_block.size() * sizeof(int), pFile);
fclose(pFile);
Run Code Online (Sandbox Code Playgroud)

第二个ostream:

ofstream fout;
data.id = seedFileId; 
seedFileId++;

std::string fileName = getFileName(data.id);
char *fNameArray = (char*)fileName.c_str(); …
Run Code Online (Sandbox Code Playgroud)

c++ file-io file visual-studio-2008

5
推荐指数
1
解决办法
1837
查看次数

用于固定大小和预定义类型数据的C++向量,列表或数组

我正在尝试为新项目选择合适的数据类型以满足以下要求:

  • 高度!时间关键(用于输入数据)
  • 对容器中的数据没有随机插入或任何操作(只读和顺序插入)
  • 大小将在编译时固定(因此不需要动态alloc)
  • 在某个定义的时间段(通过线程或服务)之后,数据将按顺序删除,并且空白空间必须再次可用于新的数据.

恩.让我们说1,2,3,4,5,6插入容器中.一段时间后6将被删除,7将被插入所以列表将是7,1,2,3,4,5然后5将被删除等...但大小必须相同.

我想知道从性能和内存的角度来看,哪种数据结构对我来说是最有效和最适合的数据结构.

谢谢...

编辑:顺便说一下它与基本的FIFO逻辑有点不同,因为我们创建10个元素(大小)数据容器,但只插入3个元素,即使它没有到达容器的末尾(大小的限制),如果通过它的指定时间将被删除.

顺便说一句,我正在考虑使用boost:array,但对std:vector和std:deque有点困惑.这个坐姿有什么特别的优势吗?

c++ arrays performance list vector

2
推荐指数
1
解决办法
1024
查看次数