指向std ::结构向量的指针

时间:2015-08-13 03:31:40

标签: c++ arrays pointers vector struct

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;
}

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

我想要做的事情就是这样,但我确信这可以做得更好:

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

s->Value1 = 42;
s->Value2 = 6;

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

2 个答案:

答案 0 :(得分:1)

到目前为止,所提供的答案都缺少了房间里的大象。你可以创建一个指向vector元素的指针,如下所示:

(易出错)代码清单

#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;
}

示例输出

sVec[5] = (45,20)

但是,如果您要生成指向vector /&#34;数组&#34;的各个元素的指针,vector不是您想要使用的抽象类型。当向量需要重新调整大小(缩小或增长)the iterators are invalidated时,所以你的指针将指向现在释放的内存,从而导致程序崩溃。如果要将原始指针直接指向向量元素,首先需要:

  1. 使用list而不是vector
  2. 可能使用托管指针来处理引用计数。
  3. 最后,在处理模板类(如vectorlisthash_table等等)时,您应该尝试习惯使用上面使用的迭代器示例,因为您不需要&# 39;在使用无效索引时必须担心检查异常(重载的[]运算符可以抛出异常,除非用.at()成员函数替换它们而不是元素访问。

答案 1 :(得分:0)

对于std :: vector,&v[i],为您提供指向第i个元素的指针。您的示例代码变为:

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

s->Value1 = 42;
s->Value2 = 6;

所以单行是Struct_t* s = &Struct[value];

这样做没有错,但是像C ++的大多数方面一样,你需要了解你在做什么。上述代码完全有效,并由标准保证。 (另请注意,此答案中的代码避免了原始代码中的错误,其中s是指向临时副本的指针,并且未对Struct向量的内容进行任何更改。)

是的,调整Struct大小会使调整大小之前的任何指针无效,是的,使用迭代器通常是一种更好的技术。但这是对原始问题的正确和合理的答案。