我有一个类,我试图设置一个值,如果它正确插入到一个集合中。这是上课。
class flow {
std::string source, dest, protocol, startTime; //
public:
flow() {}
flow(std::string & s, std::string & d, std::string p) :
source(s), dest(d), protocol(p) {}
bool operator==(const flow& rhs) const;
bool operator<(const flow& rhs) const;
bool setFields(std::string &, std::string &, std::string &);
std::string getSource() const;
std::string get_startTime() const;
//other getters not shown
void set_startTime(std::string &);
//other setters not shown
virtual ~flow();
std::string createKey() const;
};
bool flow::setFields(std::string & srcArg, std::string & destArg,
std::string & protocolArg) {
source = srcArg;
dest = destArg;
protocol = protocolArg;
return true;
}
void flow::set_startTime(std::string & a) {
startTime = a;
}
我有一组这个班级set<flow> flows;
。我将此流程插入到集合中。如果它无法插入,我知道我已经在跟踪此流程,但如果不是,我想设置它的开始时间。
flow currentFlow;
//...
protocol = string("TCP");
currentFlow.setFields(source, dest, protocol);
key = createKeyFromFlow(currentFlow);
ret = flows.insert(currentFlow); // see if we can insert this flow
if (ret.second == false) {
inserted = false;
// we failed to insert
it = ret.first; // "it" now points to element already in the set
} else {
string stringTS;
std::stringstream strstream;
//convert to string and store
strstream << currentTimeStamp;
strstream >> stringTS;
cout << stringTS << endl;
currentFlow.set_startTime(stringTS);
//sanity check to assert the value was set
cout << currentFlow.get_flow() << endl;
}
完整性检查通过,值为print。但是,稍后当我显示这些流时,不再设置该值。我怎样才能坚持这个价值?这个currentFlow与我的set中持续存在的流量不一样吗?
如果您需要更多信息,请告诉我,我不想发布太多代码,但足以诊断问题。
答案 0 :(得分:2)
问题是set::insert
创建了流对象的副本。因此,您在
currentFlow
所做的任何更改
ret = flows.insert(currentFlow);
对实际存储在集合中的对象没有影响。
编辑: 正如Matt McNabb在下面提到的那样,人们应该意识到只需修改存储在流集中的副本就无法解决这个问题,因为这会使其密钥无效(例如,阅读what happens when you modify an element of an std::set?以获取更多信息)