通过指针在函数之间传递向量

Posted

技术标签:

【中文标题】通过指针在函数之间传递向量【英文标题】:passing a vector between functions via pointers 【发布时间】:2011-03-18 04:28:48 【问题描述】:

有人建议我使用指针来添加我想从某个现有函数传递给另一个函数的向量。不过,我真的很纠结如何从该指针中获取信息。out。我已经尝试了很多我在这里和那里读到的东西,所以让我来演示一下我在说什么。

主要程序:

std::vector<float> * dvertex=NULL;

track.calculate(irrelevant stuff, dvertex)

辅助程序(跟踪、计算)

track::caclulate(irrelevant stuff, vector<float> * dvertex)

...
vector<float> pos;
... pos filled after some calculations
if(! (dvertex==NULL))

  dvertex = &pos1;

回到初级,除非我在上面搞砸了,这是我尝试过的一些事情

1

(*dvertex).at(0)
float z = (*dvertex).at(0)

2

(*dvertex)[0]

还有一堆没有编译的东西。我很困惑,因为我不确定如何从主程序中的该向量中获取特定值。我什至认为它可能是 if(! (dvertex==NULL)) 位,所以我将其更改为 if(dvertex==NULL) 但仍然没有乐趣。任何帮助将不胜感激。

*编辑/更新*非常感谢大家的帮助,但我担心我仍然做错了。

所以按照我只是传递参考的建议:我这样做了:

主要

std::vector<float> dvertex;
track.calculate( foo, &dvertex);

次要保持不变(使用 !Null 检查)

主要

std::cout<<dvertex[0]<<std:endl; 

(在实际使用数据的其他尝试中)

非常感谢您对我仍然做的不正确的事情提出任何想法。一切都会编译,当程序到达使用来自 dvertex 的数据时,程序就会冻结。

编辑:最终修复

在我需要的二级程序中

*dvertex = pos1;

而不是

dvertex = &pos1;

【问题讨论】:

不要向您提出更多建议,但您应该将其作为参考传递。这样就无需取消引用任何内容,并且您可以获得所有相同的好处。 @jonsca 是对的,您应该执行类似 track::caclulate(irrelevant stuff, vector & dvertex) 之类的操作,然后就像将 dvertex 视为法线向量并使用它在方法之外仍然可用。 如果容器将被修改,有时我喜欢通过指针传递。在通常需要使用地址运算符的调用站点:func(&amp;my_vertor); 这是一个小提醒,该函数实际上修改了容器。如果总是按引用传递,不看函数声明就无法区分修改调用和非修改调用。但是,这纯粹是风格问题,没有性能优势。 @dappawit:那么函数应该更好地命名。我不需要看签名就知道swap 会修改参数。 【参考方案1】:

我不确定为什么这些没有为您编译,因为只要指针有效且不为空,它们就有效:

void f(std::vector<int>* v)

    if( v != 0 ) 
        int n = (*v)[0];     // ok
        int m = (*v).at(0);  // ok
        int o = v->at(0);    // ok
    

但没关系。如果必须更改向量,请使用引用,如果必须更改,请使用 const 引用。很少需要通过指针获取容器。

另外,我建议你检查指针 0,而不是 NULL,因为有时根据 C 编译器,NULL 被定义为 (void*)0。但有些人可能会在这里争论。

【讨论】:

C 编译器可以将 NULL 定义为 (void*)0,但 C 编译器≠ C++ 编译器。符合标准的 C++ 编译器必须将 NULL 定义为“实现定义的 C++ 空指针常量”(C++03 标准§18.1/4)。由于 0 也是一个有效的空指针常量,因此没有技术理由偏爱 0 或 NULL — 选择纯粹是风格上的。我个人更喜欢 NULL,因为它明确表示您正在处理指针,而使用 0 时,从上下文中并不总是清楚您正在处理整数还是指针。 我更喜欢检查 NULL 它在视觉上更具特色(等待 nullptr) @AdamRosenfield 如果 0 未定义实现而 NULL 是,这难道不是一个足够好的技术理由选择 0 而不是 NULL 但是我真的不是故意要开始这个争论的。我在回答中说,我认为有些人会不同意。我只是恭敬地不同意。【参考方案2】:

如果您要修改向量,您可能只想通过引用传递它。但是,如果确实使用指针,则需要在 main 中定义一个向量,然后传递该向量的地址:

void calculate(std::vector<float> *vertex_array)  
    vertex_array->pushback(1.0f);
    vertex_array->pushback(2.0f);


int main()     
    std::vector<float> vertexes;
    calculate(&vertexes);

    std::copy(vertexes.begin(), vertexes.end(), 
        std::ostream_iterator<float>(std::cout, "\n"));
    return 0;

【讨论】:

【参考方案3】:

请参阅上面的注释,但要使您的方案正常工作,您需要

std::vector<float> * dvertex=NULL;

成为

std::vector<float> * dvertex = new std::vector<float>();

【讨论】:

以上是关于通过指针在函数之间传递向量的主要内容,如果未能解决你的问题,请参考以下文章

将指针向量传递给c ++中的函数[重复]

通过指针或引用将映射传递给函数?

C++:试图理解通过引用传递向量

如何使用 C++ 中的指针通过指针传递多维向量?

C++:使用 int 指针指向在函数内部创建的向量

通过引用函数传递向量,但更改不会持续