0

以下は私のコードです:

typedef struct
{
  unsigned page;
  unsigned slot; 
} RID;

//Below struct has the Key on which I want to apply the sorting
struct LeafDataEntry
{
    void *key;
    RID rid;
};

//This is the sorting function I am using
bool leadNode_Key_asc( const LeafDataEntry &a, const LeafDataEntry &b){

    return strcoll((char *)a.key, (char *)b.key) > 0;
            //(strcmp((char *)a.key, (char *)b.key) > 0);
}

int main(){

    vector<LeafDataEntry> lde;

    char a[4] = {'D', 'B', 'C', 'D'};
    RID aRID = {0,0};
    char b[4] = {'A', 'C', 'B', 'A'};
    RID bRID = {0,1};

    unsigned size = sizeof(unsigned);

    lde.resize(2);
    char *tempPtr = (char *)malloc(8 + sizeof(RID));

    memcpy(tempPtr, &size, 4);
    tempPtr += 4;
memcpy(tempPtr, a, 4);

    tempPtr -= 4;
    lde[0].key = malloc(8);
    memcpy(lde[0].key, tempPtr, 8);
    memcpy(&lde[0].rid, &aRID, sizeof(RID));

    memcpy(tempPtr, &size, 4);
    tempPtr += 4;
    memcpy(tempPtr, b, 4);

    tempPtr -= 4;
    lde[1].key = malloc(8);
    memcpy(lde[1].key, tempPtr, 8);
    memcpy(&lde[1].rid, &bRID, sizeof(RID));

    std::sort(lde.begin(), lde.end(), leadNode_Key_asc);

    cout << "Sorted Data :: " << endl;
    for(int j=0; j<2; j++){
        cout << "KEY :: " << (char *)(lde[j].key);
        cout << ", RID ::" << "{" << lde[j].rid.pageNum << ", " <<        
    lde[j].rid.slotNum << "}";
  }
return 0;
}

*key値に基づいて上記のldeベクトルをソートしたいと思います。上記の方法では機能しません。

注:上記の構造体のデータ型を変更することはできません。

4

3 に答える 3

0

あなたのコードには2つの問題があります:

最初に、LeafDataEntry のキーに文字列を [文字列のサイズの 4 バイト] + [文字列] として保存していますが、strcoll は '\0' で終わる文字列を取り、サイズが先頭にない文字列を取ります。データ型を変更したい場合、これで問題が解決します。

bool leadNode_Key_asc( const LeafDataEntry &a, const LeafDataEntry &b){
    size_t size1 = *(unsigned*)(a.key), size2 = *(unsigned*)(b.key);
    string a1 = string((char*)a.key + 4, size1), a2 = string((char*)b.key + 4, size2);
    return a1 < a2;
}

次に、次の 2 行:

    cout << ", RID ::" << "{" << lde[j].rid.pageNum << ", " <<        
    lde[j].rid.slotNum << "}";

次のものに置き換える必要があります。

    cout << ", RID ::" << "{" << lde[j].rid.page << ", " <<        
    lde[j].rid.slot << "}";
于 2012-11-15T23:29:15.393 に答える
0
typedef struct
{
  unsigned page;
  unsigned slot; 
} RID;

struct KeyStruct
{
    unsigned size;
    char     szKey[4];
    KeyStruct(unsigned s, char *k) : size(s) { memcpy(szKey, k, sizeof(szKey)); }
};

//Below struct has the Key on which I want to apply the sorting
struct LeafDataEntry
{
    KeyStruct key;
    RID rid;    
    bool operator<(const LeafDataEntry& lde)
    {
        for (int i = 0; i < sizeof(key.szKey); ++i)
        {
            if (key.szKey[i] != lde.key.szKey[i]) return key.szKey[i] < lde.key.szKey[i];
        }
        return false;
    }
};

//This is the sorting function I am using
bool leadNode_Key_asc( const LeafDataEntry &a, const LeafDataEntry &b)
{
return true;

}

int main()
{

    vector<LeafDataEntry> lde;

    char a[4] = {'D', 'B', 'C', 'D'};
    RID aRID = {0,0};
    char b[4] = {'A', 'C', 'B', 'A'};
    RID bRID = {0,1};

    unsigned size = sizeof(unsigned);

    lde.reserve(2);

    LeafDataEntry lde_a = { KeyStruct(size, a), aRID };    
    lde.push_back(lde_a);

    LeafDataEntry lde_b = { KeyStruct(size, b), bRID };    
    lde.push_back(lde_b);

    std::sort(lde.begin(), lde.end());

    std::cout << "Sorted Data :: " << std::endl;
    for(int j=0; j<2; j++)
    {
        std::cout << "KEY :: " << lde[j].key.size << ":" << lde[j].key.szKey;
        std::cout << ", RID ::" << "{" << lde[j].rid.page << ", " << lde[j].rid.slot << "}" << std::endl;
    }
    return 0;
}
于 2012-11-16T03:42:59.040 に答える
0

*キー値に基づいて上記のldeベクトルをソートしたい。何らかの方法を提案してください... >上記の方法では機能しません。

コードは記述どおりに機能しますが、無効です。size_tとchar [4]で構成されるchar [8]へのキーポイント。

ただし、 return strcoll((char *)a.key, (char *)b.key) > 0; を呼び出します。cout << "KEY :: " << (char *)(lde[j].key);.

ただし、キーは文字列を指すのではなく、size_t を指します。キーの and に '\0' を追加し、((char *)key) + 4 を使用すると、すべてが期待どおりに機能するはずです。

于 2012-11-15T23:24:57.713 に答える