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

时间:2012-02-29 18:31:33

标签: c++ pointers dereference

在以下情况下,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。是否有更清晰的方式来写这个?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案:

sortMyVectors(myVectors, *myObj);

因为看起来你现在有一些基本的指针问题(而且我怀疑这是某种作业的练习),建议学习迭代器可能有点太高级,但是你应该研究一下稍后与std::sort一起使用任何手动排序都会很难被击败。

尝试提高对指针的理解:

MyObj* myObjPtr = ...;

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

MyObj& myObjRef = *myObjPtr;

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

回应您的评论:

  

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

std :: sort接受严格的弱排序谓词(基本上是一个函数或函数对象,它根据element1&lt; 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);

上面的代码根据字符串的长度从最短字符串到最长字符串对字符串进行排序,而不是按字符串顺序排序它们的默认行为(默认运算符&lt;字符串实现)(字母顺序,粗略地说)。

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

答案 2 :(得分:0)

如果您只是希望m​​yFunction调用传入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... 
    }