2017-06-09 66 views
-3

我在C++中有以下程序。目标是接收一些日志(来自filedata变量),解析日志,并将它们保存到对象列表中。在C++列表中插入对象

解析其工作良好的部分。但是,当我迭代解析的矢量并尝试将一些元素保存到列表中时,我遇到了问题。我可以获取元素(例如:elements.at(0)我得到第一列(时间戳),但是当我保存到我的列表中时,我们保存了两次日志(在这种情况下,filedata只有两个日志),但是我们节省了两次相同的日志

我CPP项目:

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
#include <iterator> 
#include <list> 

class UserLogRecord 
{ 
public: 
    std::string timestamp; 
    std::string id; 
    std::string name; 
    std::string data; 
}; 

std::vector<std::string> explode(std::string const & s, char delim) 
{ 
    std::vector<std::string> result; 
    std::istringstream iss(s); // sequence of characters 
    for (std::string token; std::getline(iss, token, delim);) 
    { 
    result.push_back(std::move(token)); //transfer token to vector 
    } 
    return result; 
} 

int main() 
{ 
    const char* filedata = 
    "1496843100;2017-06-07 13:45:00;000002D8;2600;user1\n" 
    "9999999999;2017-06-07 13:45:00;000002D9;2800;user2"; 

    std::vector<std::string> lines = explode(filedata,'\n'); 

    std::list<UserLogRecord* > userLogRecords; 
    UserLogRecord* userLogRecord = new UserLogRecord; 

    //vector 
    for(int i = 0; i < lines.size(); i++) 
    { 
    std::vector<std::string> elements = explode(lines[i], ';'); 
    userLogRecord->timestamp = elements.at(0); 
    userLogRecord->id = elements.at(2); 
    userLogRecord->name = elements.at(4); 
    userLogRecord->data = elements.at(3); 
    userLogRecords.push_back(userLogRecord); 
    } 

    //list of logs 
    std::list<UserLogRecord* >::const_iterator itLog = userLogRecords.begin(); 
    while (itLog != userLogRecords.end()) 
    { 
    std::cout << '\n' + (*itLog)->timestamp + '\n'; 
    std::cout << (*itLog)->id + '\n'; 
    std::cout << (*itLog)->name + '\n'; 
    std::cout << (*itLog)->data + '\n'; 
    ++itLog; 
    } 

    return 0; 
} 

输出(当遍历列表):

9999999999 
000002D9 
user2 
2800 

9999999999 
000002D9 
user2 
2800 

预期输出:

1496843100 
000002D8 
user1 
2600 

9999999999 
000002D9 
user2 
2800 

我的程序保存两个日志(这部分是“好”,我只有两个日志),但其保存始终是相同的(奇怪的是最后的日志)

+0

我已经编辑帖子,并把正确的代码。谢谢 – rrpik93

+0

你调试过吗?问问你自己:*你在推荐什么?*这是一个*指针列表*。 *相同*指针被重复推入列表中。这里没有明确的记录。只有一个*。 – WhozCraig

+0

我相信,一个好的调试器会发现问题。提示:看看你的对象'userLogRecord'。 – Rene

回答

1

您只使用一个UserLogRecord并简单修改数据而不是在列表中添加新元素。

std::list::push_back正在添加一个指向UserLogRecord的指针的副本,该副本对于循环的所有迭代都保持相同。同一个指针在列表中被多次推送,因此所有元素都有相同的数据。

以下代码将解决此问题。每次迭代都会创建一个新的UserLogRecord。但是,当您不再需要时,您必须记住用delete释放分配的内存。

//vector 
for(int i = 0; i < lines.size(); i++) 
{ 
    UserLogRecord* userLogRecord = new UserLogRecord; 

    std::vector<std::string> elements = explode(lines[i], ';'); 
    userLogRecord->timestamp = elements.at(0); 
    userLogRecord->id = elements.at(2); 
    userLogRecord->name = elements.at(4); 
    userLogRecord->data = elements.at(3); 
    userLogRecords.push_back(userLogRecord); 
} 
+1

更好的是,使用'std :: list '并且首先停止使用裸指针。有*零*证据表明它在这个代码*中有什么好处*。 – WhozCraig

+0

嗨。谢谢回复。其作品。我是新的C++,所以有时我有这个错误。 是的,我忘了删除(及其非常重要)。女巫的地方,我需要把删除?因为我不能放入矢量迭代中,但它只有我可以访问userLogRecord的地方,因为我在里面声明。外面我没有访问 – rrpik93

+0

它只是一个测试代码这个例子。我正在建立一个实时API,在这种情况下,我需要使用指针 – rrpik93