更新:发布错误的主...关于丢失的分割功能,我从我以前的工作中复制了该功能,所以它应该可以正常工作。 start_和end_变量是两个全局变量,在这个程序中不应该受到影响。之前我认为这是一个记忆问题,但现在我真的不知道问题是什么。谢谢你的帮助。 另外,我把主要关闭的所有指针都拿掉了,所以现在它只有引用以避免大量内存使用。
编译后我收到此错误。我查看了在线帖子,看到它可能是由于复制大型结构和耗尽内存造成的。我使用指针来避免这样的问题,但错误仍然会弹出..
在抛出'std :: bad_alloc'的实例后终止调用 what():std :: bad_alloc 中止(核心倾销)
以下是我的代码。这不是很长。
class Emiss{
public:
Emiss() {};
Emiss( string w ){
word[w] = 1;
total = 1;;
}
void update(string w){
if(word.find(w) == word.end() ){
word[w] = 1;
total++;
}
else{
word[w]++;
total++;
}
}
void emissProb( ofstream& outfile ){
for(std::map<string, int>::iterator it = word.begin(); it != word.end(); ++it){
outfile << std::left << setw(20) << it->first << setprecision(5) << it->second/(1.0*total) << endl;
}
}
map<string, int> word;
int total;
};
这是一堂课。另一类几乎与这一类相同,但有不同的用途。
class Trans{
public:
Trans() {};
Trans( string n ){
next[n] = 1;
total = 1;
}
void update(string t){
if(next.find(t) == next.end() ){
next[t] = 1;
total++;
}
else{
next[t]++;
total++;
}
}
void transProb( ofstream& outfile ){
for(std::map<string, int>::iterator it = next.begin(); it != next.end(); ++it){
outfile << std::left << setw(20) << it->first << setprecision(5) << it->second/(1.0*total) << endl;
}
}
map<string, int> next;
int total;
};
然后输出到文件的函数
void probs( map<string, Emiss>& emiss, map<string, Trans>& trans, ofstream& outfile ){
//map<string, Emiss> *emiss = &e;
//map<string, Trans> *trans = &t;
std::map<string, Emiss>::iterator ite;
std::map<string, Trans>::iterator itt;
for(ite = emiss.begin(); ite != emiss.end(); ++ite){
outfile << ite->first << ": "<<endl;
emiss[ite->first].emissProb(outfile);
}
for(itt = trans.begin(); itt != trans.end(); ++itt){
outfile << itt->first << ": "<<endl;
trans[itt->first].transProb(outfile);
}
}
然后它只是我的主函数,它读入一个非常大的文件并解析为两个类的向量
int main(int argc, char* argv[]){
if(argc != 2){
std::cerr << "Insufficient command argument";
return 1;
}
string inputf = argv[1];
string outf = "trans_emiss.txt";
std::ifstream istr(argv[1]);
if(!istr){
std::cerr << "ERROR: Invalid arguments \nUSAGE: ./a.out "+ inputf +" "+ outf << endl;
return EXIT_FAILURE;
}
std::ofstream out_str(outf);
if(!out_str) {
std::cerr << "ERROR: Invalid arguments \nUSAGE: ./a.out "+ inputf +" "+ outf <<endl;
return EXIT_FAILURE;
}
string line;//each line of the file
string prev = "_START";//previous tag
vector<string> word;
map<string, Emiss> emiss;
map<string, Trans> trans;
while( getline(istr,line) ){
istringstream iss(line);
if( line[0] == '#' || line.empty() ){
if(start_ != end_){
if( trans.find(prev) == trans.end() ){
Trans t("_END");
trans[prev] = t;
}
else{
trans[prev].update("_END");
}
prev = "_START";
end_++;
}
continue;
}
//if is a token
word = split(line, ' ');
if( word[0].compare("1") == 0){
start_ ++;
}
if( emiss.find( word[4]) == emiss.end() ){
Emiss e(word[2]);
emiss[ word[4] ] = e;
}
else{
emiss[ word[4] ].update( word[2] );
}
if( trans.find(prev) == trans.end() ){
Trans t( word[4] );
trans[ prev ] = t;
}
else{
trans[ prev ].update( word[4] );
}
prev = word[4];
}
if(start_ != end_){
if( trans.find(prev) == trans.end() ){
Trans t("_END");
trans[prev] = t;
}
else{
trans[prev].update("_END");
}
prev = "_START";
end_++;
}
probs(emiss, trans, out_str);
out_str.close();
return 0;
}