基本上,比方说,我有以下数据:
(请注意,列数会随着我获得的每一条数据而变化,即我需要保持一般性,并且不能将我的解决方案仅限于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
在存储这样的数据方面是否也是正确的方法?答案 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并将键/值对(或只是值)插入向量中。