【问题标题】:Passing vector to function (pointers/addresses)将向量传递给函数(指针/地址)
【发布时间】:2012-02-29 18:31:33
【问题描述】:

在以下情况下,sortMyVectors 的参数列表必须是什么样子,以及如何从 myFunction 中调用它?

std::vector<Vector2> myFunction ( MyObj * myObj ) {

    std::vector<Vector2> myVectors;
    // fill with lots of Vector2(double x, double y) objects

    sortMyVectors( ???-myVectors, ???-myObj);

    return myVectors;
} 


void sortMyVectors( vector<Vector2> &myVectors, const MyObj &myObj) {

    // sort the std::vector using myObj
    // modifies order of Vector2s within the passed-in myVectors
    // does not modify myObj
    // need to be able to access with myVectors[0].x here...
}

调用方式是myFunction(&amp;(*myObj));,其中myObjlist&lt;MyObj&gt;::iterator。有没有更简洁的方法来写这个?

【问题讨论】:

  • 没什么特别的:sortMyVectors(myVectors, *myObj);myVectors是一个变量,所以可以直接传给引用; myObj 是一个指针,所以需要解引用一次才能与MyObj&amp; 兼容。
  • 感谢您的解释。但是,我收到此错误:“未定义对 sortMyVectors(std::vector&lt;_Vector2, std::allocator&lt;_Vector2&gt; &gt;&amp;, MyObj&amp;) 的引用”
  • 您可以在文件中将sortMyVectors 移动到myFunction 之前,或者在.c 或.h 文件的顶部为其添加前向声明:void sortMyVectors( vector&lt;Vector2&gt; &amp;myVectors, const MyObj &amp;myObj);
  • 哦...是的,这就是问题所在(我在课堂上遇到过,忘记输入Classname::myFunction(...)。太好了,现在可以了:)你能不能看看我打电话给@的方式987654336@(我的问题的底部),让我知道如何让&amp;(*) 更干净一点?
  • 您可以更改为myFunction(list&lt;MyObj&gt;::const_iterator&amp; myObj),其他一切保持原样:它应该可以编译并运行,并且您可以直接传递您的迭代器。

标签: c++ pointers dereference


【解决方案1】:
sortMyVectors( ???-myVectors, ???-myObj);

答案:

sortMyVectors(myVectors, *myObj);

目前看来您在使用指针方面遇到了一些基本问题(我怀疑这是某种家庭作业的练习),建议您学习迭代器可能有点太高级了,但您应该研究一下后来加上std::sort,这将很难用任何手动排序来击败。

为了提高你对指针的理解:

MyObj* myObjPtr = ...;

这是一个指针。它指向一个内存地址。假设它指向一个有效的,我们可以这样做:

MyObj& myObjRef = *myObjPtr;

现在我们取消引用指针以获取指针,并将其分配给一个引用,该引用也类似于指针,但隐藏了指针/指针的区别(不需要 operator* 访问指针/引用的对象)。

回应您的评论:

“排序”基本上是根据这些向量的距离对它们进行排序 另一个向量,但仅在特定情况下,所以我不知道是否 有一种标准的方法可以做到这一点..

std::sort 接受严格的弱排序谓词(基本上是一个函数或函数对象,它根据 element1

bool length_is_less(const string& str1, const string& str2)
{
    return str1.size() < str2.size();
}

vector<string> my_strings = ...;
sort(my_strings.begin(), my_strings.end(), length_is_less);

上面的代码是根据字符串的长度从最短字符串到最长字符串对字符串进行排序,而不是按照字符串顺序(粗略地说是字母顺序)对字符串进行排序的默认行为(字符串的默认操作符

鉴于可以定义自己的谓词来比较对象,您基本上可以使用 std::sort 按任何条件对任何内容进行排序。

【讨论】:

  • 感谢您的解释,快速提问,如果构造函数有参数const MyObj &amp;myObj,那么我如何将其分配给数据成员MyObj * myObj(与您在多于)?还是我也应该更改数据成员?
  • @Ben 简化答案:你不能因为你的 const 引用是只读的并且 MyObj* 是可变的。这将违反 const 安全的全部要点,以防止您意外修改您不想要的东西。如果是 const MyObj*,那么你可以这样做: const MyObj* myObjPtr = &myObjRef;
  • @Ben 粗略地说,从指针到指针是 operator&,从指针到指针是 operator*。
【解决方案2】:

不要重新发明排序,使用std::sort,它允许您传入一个谓词对象,例如MyObj,只要它有一个operator() 来进行排序。它使用迭代器而不是容器,这提供了更大的灵活性。

【讨论】:

  • “排序”基本上是根据这些向量与另一个向量的距离对它们进行排序,但仅在特定情况下,所以我不知道是否有标准的方法来做到这一点......但是,我的问题是我需要为指针添加什么?
【解决方案3】:

如果您只想让 myFunction 调用 sortMyVectors 并传入 myObj 和 myVectors,请执行以下操作:

    std::vector<Vector2> myFunction ( MyObj * myObj ) { 

        std::vector<Vector2> myVectors; 
        // fill with lots of Vector2(double x, double y) objects 

        sortMyVectors(myVectors, myObj); 

        return myVectors; 
    }  


    void sortMyVectors(vector<Vector2> &myVectors, const MyObj *myObj) { 

        // Check for null pointer of myObj
        // sort the std::vector using myObj 
        // need to be able to access with myVectors[0].x here... 
    }

【讨论】:

  • 好吧,我现在正在使用引用,这样我就不需要进行空指针检查;)
猜你喜欢
  • 2020-01-09
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2020-01-25
  • 2019-07-26
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多