关于:
p.s.我知道这是一个具体问题,但我很茫然,不知道为什么会发生这种情况
下面的算法应该在列表中添加一个结构。每个结构都是server_connection
对象,接收列表包含在另一个名为VPN_Server
的结构中。
将结构添加到列表时,它只保留添加的第一个结构,并且不再添加。
调试器窗口确认了这一点:
对于每个新IP,会创建一个新的VPN_Server
结构,并创建一个新的server_connection
并将push_back
添加到ServerInstancesList
列表中。但是当在foreach循环中时,尝试添加对象是徒劳的。
问题:
将server_connection
对象推送到特定VPN_Server
结构时,它会将此数据保存在临时foreach容器中,但不会应用它。
我尝试过:
向addConnection()
VPN_Server
struct
方法
void addConnection(server_connection s_con){ ServerInstancesList.push_back(s_con); }
创建临时列表,添加server_connection并创建新的VPN_server对象,并将其设置为等于当前的foreach容器。
这些都没有帮助。
测试&深入描述:
在算法中,我的第一个和第三个vpn_connection
struct
具有相同的IP。在第三次迭代中,执行foreach循环并发生以下情况。
VPN_Server
ser包含第一个结构信息的信息,即QList<server_connection>
中名为ServerInstancesList
的IP和一个对象。
ser
通过addConnection(s_con)
添加了一个对象。然后,循环终止并返回。但是ser
注册了添加的对象,而在foreach循环之外,没有添加新对象。甚至没有列表中的任何结构。
这似乎很容易解决,但我找不到它,
帮助将不胜感激!
代码:
server_connection
struct server_connection{
//Is a connection contained by IP
QString cipher,protocol;
int port;
bool lzo_compression;
server_connection(){}
server_connection(QString _cipher, QString _protocol, int _port, bool _comp){
cipher = _cipher;
protocol = _protocol;
port = _port;
lzo_compression = _comp;
}
};
VPN_Server
struct VPN_Server{
//Holds IP as sort value and list of connection info
QString VPN_IP;
QList<server_connection> ServerInstancesList;
VPN_Server(){
ServerInstancesList = QList<server_connection>();
}
VPN_Server(QString ip, QList<server_connection> server_con_list){
VPN_IP = ip;
ServerInstancesList = server_con_list;
}
void addConnection(server_connection s_con){
ServerInstancesList.push_back(s_con);
}
};
算法:
QList<VPN_Server> data_mananger::parseVPNConnections(QList<VPNConnection> l){
//Init var
QList<VPN_Server> server_list = QList<VPN_Server>();
VPNConnection v_con;
bool bAdded = false;
server_connection s_con;
//processing all vpn_connections, this is raw form sent, contains as fields, ip, cipher, protocol, port, compression
foreach (v_con, l) {
//create server_connection - data sorted by ip
s_con = server_connection(v_con.cipher, v_con.protocol, v_con.port, v_con.lzo_compression);
//pass through existing data, checking for a matching ip
foreach (VPN_Server ser, server_list) {
if (ser.VPN_IP == v_con.ip) {
//ip match found -> there already exists and ip with a server connection, adding another one with s_con
ser.addConnection(s_con);
bAdded = true;
//break current loop short searching for a matching ip
break;
}
}
//bAdded = false -> no matching IP has been found, thus creating a nw VPNServer
if (!bAdded) {
VPN_Server serv;
//creating new connection list and adding s_con to this list
QList<server_connection> list = QList<server_connection>();
list.push_back(s_con);
//adding VPNServer to list containing VPNServers
serv = VPN_Server(v_con.ip, list);
server_list.push_back(serv);
}
else
//data has been added, reseting add flag
bAdded = false;
}
return server_list;
}
答案 0 :(得分:0)
感谢所有帮助过的人!
请访问以下QT论坛的链接,并对VRonin的解决方案竖起大拇指。
同样kudo's
到@YuriyIvaskevych帮助我来SO!
重申(budum tsss *)doc page
由<{3}} 创建的Qt在进入时会自动获取容器的副本 foreach循环。如果您在迭代时修改容器,那就是 不会影响循环。 [...]使用非const引用 变量不允许您修改原始容器
解决方案
for (auto serIter= server_list.begin(); serIter!=server_list.end(); ++serIter) {
if (serIter->VPN_IP == v_con.ip) {
//ip match found -> there already exists and ip with a server connection, adding another one with s_con
serIter->addConnection(s_con);
bAdded = true;
//break current loop short searching for a matching ip
break;
}
}