指向 std::vector 结构体的指针

5 c++ arrays struct pointers vector

struct Struct_t {
    int Value1;
    int Value2;
};

vector<Struct_t> Struct;
Struct.resize(10, Struct_t());

for (int i = 0; i < 10; ++i)
{    
    Struct[i].Value1 = (i + 10) * 3;
    Struct[i].Value2 = (i + 5) * 2;
}
Run Code Online (Sandbox Code Playgroud)

如何创建指向 Struct[i] 的指针?

我想要做的基本上是这样的,但我相信这可以做得更好:

int value = 6;
Struct_t temp = Struct[value], *s;
s = &temp;

s->Value1 = 42;
s->Value2 = 6;
Run Code Online (Sandbox Code Playgroud)

主要目标是,我可以使用 1 行/函数轻松创建指向 Struct[n] 的指针。

Clo*_*oud 1

到目前为止,所提供的答案还没有解决问题。您可以创建一个指向向量元素的指针,如下所示:

(容易出错)代码列表


#include <iostream>
#include <vector>

struct Struct_t {
    int Value1;
    int Value2;
};

int main(void)
{
    std::vector<Struct_t> sVec;
    sVec.resize(10, Struct_t());

    int count = 0;
    for (std::vector<Struct_t>::iterator vIt = sVec.begin(); vIt != sVec.end(); ++vIt)
    {    
        vIt->Value1 = (count + 10) * 3;
        vIt->Value2 = (count + 5) * 2;
        count++;
    }

    Struct_t* pStruct = &sVec[5];

    std::cout << "sVec[5] = (" << pStruct->Value1 << "," << pStruct->Value2
        << ")" << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

样本输出


sVec[5] = (45,20)
Run Code Online (Sandbox Code Playgroud)

但是,vector如果您要生成指向/“数组”的各个元素的指针,则不是您想要使用的抽象类型vector。当向量需要调整大小(缩小或增长)时,迭代器将失效,因此您的指针将指向现在已释放的内存,从而导致程序崩溃。如果你想拥有直接指向向量元素的原始指针,你需要首先:

  1. 使用 alist而不是vector
  2. 可能使用托管指针来处理引用计数。

vector最后,在处理、list、等模板类时hash_table,您应该尝试习惯使用上面使用的迭代器示例,因为您不必担心在使用无效索引时检查异常(重载的运算符[]可以抛出异常,除非您将它们替换为.at()成员函数而不是元素访问)。