C ++中的表表示

时间:2016-02-23 22:45:45

标签: c++ class

基本上,比方说,我有以下数据:

enter image description here

(请注意,列数会随着我获得的每一条数据而变化,即我需要保持一般性,并且不能将我的解决方案仅限于Tenor,Date等。)

现在我希望能够在C ++中的对象/类中表示并方便地访问这些数据。

我一直在玩map一点:

#include <iostream>
#include <map>
#include <string>
using namespace std;

class my_table {
private:
    map<string, map<string, string>> c;

public:
    void set(string key1, string key2, string value){ this->c[key1][key2] = value; }

    string get(string key1, string key2){
        map<string, map<string, string>>::iterator it = this->c.find(key1);
        if (it != this->c.end()){
            map<string, string>::iterator it2 = this->c[key1].find(key2);
            if (it2 != this->c[key1].end()){
                return c[key1][key2];
            }
            return "n/a";
        }
        return "n/a";
    }
};

void main() {
    my_table a;
    a.set("1", "Tenor", "1D");
    cout << a.get("1", "Tenor") << endl; // returns '1D'
    cout << a.get("2", "Tenor") << endl; // returns 'n/a'
    cout << a.get("1", "Rate") << endl;  // returns 'n/a'
}

但我对这种实施并不过分满意。特别是,我希望能够做到这样的事情:

a.get("Tenor","3M", "Rate")                   // should return '1.6%'
a.get("Date","01-Jan-2016", "Responsibility") // should return 'MG'
a.get_all("Type","Forward", "Rate")           // should return an array {1.3%,2.4%}
a.get_row(4)                                  // should return an array {4M,...,2.0%,MG}


  • 我想知道是否有任何标准软件包可以帮助我简化整体实施?
  • 特别是,我的get功能似乎不必要地繁琐。
  • 一般来说,map在存储这样的数据方面是否也是正确的方法?
  • 如果我想将此实现概括为超过2个键,该怎么办?也许3键。我的解决方案非常严格

3 个答案:

答案 0 :(得分:3)

enum struct Type {
  Spot
  Forward
}


struct Row {
  string tenor;
  Date date;
  int convention;
  Type type;
  double rate;
  ResposibilityType responsibility;
};

std::vector<Row> table = {
  [...]
}

使用std::find_if访问您。数据库中的表可能在内部存储。如果您需要多个主键,则可以为每个键创建一个映射,该映射从主键映射到table中的元素。如果你想要一个组合键,你需要像std::map<std::pair<Key1,Key2>, Row*>

这样的元组

答案 1 :(得分:1)

来自boost.ublas的matrix type怎么样?您可以创建一个简单的枚举类型以轻松引用列。

对于查询,您可以通过filter_iterator快速构建内容。

希望这有帮助!

编辑:抱歉没有注意到您的评论。我能想到的支持动态列大小的快速入侵是使用哈希映射将列名存储到单独的哈希映射中的列索引映射。祝你好运!

答案 2 :(得分:0)

将自己限制在地图上可能会使这种情况过于复杂。如果我理解正确,那么在编译时数据结构是完全未定义的。在这种情况下,实现它的一种更简单的方法可能是作为散列键值三元组的向量,如下所示:

#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>

using namespace std;

class HashKeyValue
{
private:
    string hash;
    string key;
    string value;

public:
    HashKeyValue() {}
    HashKeyValue(string h, string k, string v)
    {
        hash = h;
        key = k;
        value = v;
    }
    string getHash()  { return hash;  }
    string getKey()   { return key;   }
    string getValue() { return value; }
};

class my_table
{
private:
    vector<HashKeyValue> hkv;

public:
    my_table() {}
    void set(string h, string k, string v)
    {
        hkv.push_back(HashKeyValue(h, k, v));
    }
    string getV(string h, string k)
    {
        for (unsigned int i = 0; i < hkv.size(); i++)
        {
            if (hkv[i].getHash() == h && hkv[i].getKey() == k)
                return hkv[i].getValue();
        }
        return "n/a";
    }
    string getByColValue(string col1, string val, string col2)
    {
        string hash;
        int got = 0;
        for (unsigned int i = 0; i < hkv.size() && !got; i++)
        {
            if (hkv[i].getKey() == col1 && hkv[i].getValue() == val)
            {
                hash = hkv[i].getHash();
                got = 1;
            }
        }
        if (got)
        {
            for (unsigned int i = 0; i < hkv.size(); i++)
            {
                if (hkv[i].getHash() == hash && hkv[i].getKey() == col2)
                    return hkv[i].getValue();
            }
            return "n/a";
        }
        else return "n/a";
    }
};


int main()
{
    my_table m;
    m.set("1", "Tenor", "1D");
    m.set("3", "Tenor", "3M");
    m.set("3", "Rate", "1.6%");
    cout << "get-1-Tenor(1D): " << m.getV("1", "Tenor") << endl;
    cout << "get-1-Alto(n/a): " << m.getV("1", "Alto") << endl;
    cout << "get-3-Rate(1.6%): " << m.getV("3", "Rate") << endl;
    cout << "getBCV-Tenor-3M-Rate(1.6%): " << m.getByColValue("Tenor", "3M", "Rate") << endl;
    return 0;
}

希望getByColValue()有道理;它首先查找哈希值,然后查找该哈希值的Rate。哈希是将每个键值对与同一行上的其他键值相关联的内容。对于getByColValue()情况,更改vector<string>以返回getByColValue("Type","Forward","Rate")应该不是太棘手:只需将哈希值设为vector<string>,将返回类型定义为另一个vector<string>,以及其他一些调整。

这也使得getRow()的实施相当微不足道;只需循环遍历hkv,其中hash == rowid并将键/值对(或只是值)插入向量中。