vector <string> push_back crash </string>

时间:2015-04-17 03:38:28

标签: c++ vector

我的第一个动机是使用“vector&lt; set&gt;”像这样:

ifstream fin(file)
string line;
vector< set<string> > diag;
set<string> temp_set;
vector<string> temp_vec;
while(getline(fin, line)
{ 
    temp_vec = split(line, " ");
    for(int i = 0;i < temp_vec.size();i ++)
       temp_set.insert(temp_vec[i]);
    diag.push_back(temp_set)
}

但它崩溃了,然后我使用“vector”来调试代码。 但有趣的是,当我尝试将每行字符串push_back到向量中时,程序也崩溃了。这是非常简单的代码。

ifstream fin(file);
string line;
vector<string> diag;
while(getline(fin, line))
    diag.push_back(line);

当读取某些行时,程序会突然崩溃。 另外,文件大约4G。 谁能帮助我?非常感谢。

1 个答案:

答案 0 :(得分:1)

使用此代码,temp_set只会越来越大,因为它不会在行之间清空:

ifstream fin(file);
string line;
vector< set<string> > diag;
set<string> temp_set;
vector<string> temp_vec;
while(getline(fin, line)
{ 
    temp_vec = split(line, " ");
    for(int i = 0;i < temp_vec.size();i ++)
       temp_set.insert(temp_vec[i]); // when is this set emptied?
    diag.push_back(temp_set);
}

也许试试这个:

ifstream fin(file);
string line;
vector< set<string> > diag;
vector<string> temp_vec;
while(getline(fin, line)
{
    temp_vec = split(line, " ");
    // no need for loop
    // construct a new set each time
    set<string> temp_set(temp_vec.begin(), temp_vec.end());
    diag.push_back(temp_set);
}

如果你有 C ++ 11 ,你可以更加高效:

std::ifstream fin(file);
std::string line;
std::vector<std::set<std::string> > diag;
std::vector<std::string> temp_vec;

while(std::getline(fin, line))
{
    temp_vec = split(line, " ");
    diag.emplace_back(temp_vec.begin(), temp_vec.end());
}