拥有
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
};
typedef struct addrinfo* PADDRINFOA;
我发现将其表示为std::vector的唯一方法(感谢Jefffrey)是声明
typedef struct sAddrInfo{
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
//no next pointer
}NoListAddrInfo;
然后
PADDRINFOA next = myAddrInfo;
ret->addr_vect.clear();
for(size_t i = 0;next != NULL;i++)
{
ret->addr_vect.push_back(sAddrInfo());
ret->addr_vect[i].ai_flags = next->ai_flags;
ret->addr_vect[i].ai_family = next->ai_family;
ret->addr_vect[i].ai_socktype = next->ai_socktype;
ret->addr_vect[i].ai_protocol = next->ai_protocol;
ret->addr_vect[i].ai_addrlen = next->ai_addrlen;
ret->addr_vect[i].ai_addr = next->ai_addr;
next = next->ai_next;
}
有没有办法使用更少的指令来做到这一点?
在任何情况下,
您的结构都应如下所示:
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
// notice the lack of `ai_next`
};
然后,如果你真的想保留链表,你应该使用std::forward_list
或std::list
(双向链表):
std::forward_list<addrinfo> list;
否则,如果您想使用std::vector
(从您的示例用法来看,这很合适),您只需将其更改为:
std::vector<addrinfo> vector;
结构只是类。
std::vector<addrinfo> myvec;
myvec.push_back(addrinfo());
myvec[0].ai_flags = 42;
如果你问如何将这些结构之一放在向量中......
typedef struct addrinfo ADDRINFO;
std::vector<ADDRINFO> myvec;
myvec.push_back(ADDRINFO());
myvec[0].ai_flags= 42;