将矢量传递给函数(指针/地址)

Passing vector to function (pointers/addresses)

本文关键字:指针 地址 函数      更新时间:2023-10-16

在以下情况下,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(&(*myObj));,其中myObjlist<MyObj>::iterator。有没有更干净的写法?

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

答案:

sortMyVectors(myVectors, *myObj);

由于目前您在指针方面似乎遇到了一些基本问题(我怀疑这是一些家庭作业的练习),建议您学习迭代器可能有点过于先进,但您应该稍后与std::sort一起研究这一点,这在任何手动排序中都很难击败。

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

MyObj* myObjPtr = ...;

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

MyObj& myObjRef = *myObjPtr;

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

针对您的评论:

"排序"基本上是根据这些向量与另一个矢量,但只在特定情况下,所以我不知道有一种标准的方法可以做到这一点。。

std::sort接受一个严格的弱排序谓词(基本上是一个函数或函数对象,它根据element1<element2是否返回true/false)。示例:

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根据任何条件对任何内容进行排序。

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

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

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