是否有将单链表转换为 std::vector 的标准程序



拥有

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_liststd::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;

最新更新