这在某些语言中非常容易,而在其他语言中则不那么容易。我不太懂C++。我正在阅读一个有数千行问题标题格式的文件,并一遍又一遍地阅读该文件数千次。
基本上,我的程序中有一些整数,比如"100, 4, 1
",我想在文本文件中查找序列中的最后一个数字,所以这行可能是"100_4_1 - 15
",我想要得到15
。如何做到这一点?
我的程序中有一些整数,比如"100,4,1","100_4_1-15",我想要15
struct Key
{
int a_, b_, c_;
Key(int a, int b, int c) : a_(a), b_(b), c_(c) { }
bool operator<(const Key& rhs) const
{
return a_ < rhs.a_ ||
a_ == rhs.a_ && b_ < rhs.b_ ||
a_ == rhs.a_ && b_ == rhs.b_ && c_ < rhs.c_;
}
};
typedef std::map<Key, int> Lookup_Table;
Lookup lookup_table;
if (std::ifstream if("filename.txt"))
{
int a, b, c;
char ignore_char;
int number;
while (if >> a >> ignore_char >> b >> ignore_char >> c >> ignore_char >> number)
lookup_table[Key(a, b, c)] = number;
}
else
{
std::cerr << "can't read input file...n";
exit(1);
}
// to find something:
Lookup_Table::const_iterator i = lookup_table.find(Key(x, y, z));
if (i != lookup_table.end())
{
// found... value accessible using *i...
}
这将取决于数字本身。。。这是10000个类似的文件吗,只是一个固定的文件吗?
例如,如果它有3个索引整数和一个需要查找的整数,那么只需将其全部加载到内存中,并在需要时查找它就很简单了。
在C/C++中,一个简单的结构数组会做得很好,例如:
#define NUMELEMENTS 1000
struct Element {
int x;
int y;
int z;
int v;
};
class Elements{
elements Element[NUMELEMENTS];
public:
int findElement(int,int,int);
void loadElements;
} E;
然后我会使用E.FindElement(100,4,1),得到15。
loadElements会通过逐行读取并分隔数字来加载文件(我会读取字符串,删除空格,统一短划线和下划线,并在分隔符之间获取数字。
findElement只会循环遍历元素。。。对于10k元素,我不会担心优化,除非它在嵌入式设备上运行。