Vince wrote:

> Hi,

>

> I am working on a project involving contactless card and to read or

> write into these cards we need some parameters (Key to use for instance).

> My problem is to store these parameters in the most efficient way.

>

> I was thinking first in a c manner as a struct array like this :

>

>

> struct TFileInfo

> {

> int nSFID, // Short file ID

> int nLID, // Long File ID

> int nKey

> };

>

>

> // not sure of the syntax, it's been a long time I haven't used it

> TFileInfo fileInfo[] =

> {

> { 0x17, 0x3127, 0x0E },

> { 0x18, 0x3128, 0x08 },

> };

>

>

> and after I need to be able to get the values associated to nSFID.

> ex :

> CMyClass::GetKey(int nSFID)

> {

> for (int i = 0; i < nItems; i++){

> if (fileInfo[i].nSFID == nSFID)

> return fileInfo[i].nKey

> }

> }

>
this will take an average of 10 comparisions to find the value, if

there's 20 elements. A std::map will take an average of 4 comparisions.

And so, which is more efficient? A linear search is O(n) while a search

on a std::map is O(log n).

>

> Or another solution would be to use a std::map<int, TFileInFo>

> but I am concerned about performance. Besides I don't find the

> initialization very elegant

>

> std::map<int, TFileInfo> fileInfo;

>

> TFileInfo stFileInfo;

>

> stFileInfo.nSFID = 0x17;

> stFileInfo.nLID = 0x3127;

> stFileInfo.nKey = 0x0E;

> fileInfo[0x17] = stFileInfo;

>

> stFileInfo.nSFID = 0x18;

> stFileInfo.nLID = 0x3128;

> stFileInfo.nKey = 0x0E;

> fileInfo[0x17] = stFileInfo;

>

>

>

> I must add that my numbers of items will be 20 max.

>

>

> If someone could inform me about this performance problem...
you might want to consider a std::set instead, since the key is

embedded into the TFileInfo struct. Then give your struct a an

operator<, or pass a functor as the 2nd template argument to std::set.

In any case, you can initialize a std::set or std::map with an array:

std::set<TFileInfo> myset(fileInfo, fileInfo + 20); // where fileInfo

is the array you have above

A std::map expects iterators to std:

airs, which makes the

initialization a little more awkward:

// you must give TFileInfo a constructor

std:

air<int, TFileInfo> init[] =

{ std::make_pair(0x17, TFileInfo(0x17, 0x3127, 0x0E)),

std::make_pair(... , TFileInfo( ... )),

...

};

std::map<int, TFileInfo> mymap(init, init + 20);