我需要一个能够快速搜索超过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--: …
我正在编写一个应用程序,它通过简单的函数调用接收二进制数据流,例如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) 我正在尝试为新项目选择合适的数据类型以满足以下要求:
恩.让我们说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++ ×3
arrays ×1
boost ×1
containers ×1
file ×1
file-io ×1
list ×1
performance ×1
search ×1
vector ×1