在以下情况下,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));
,其中myObj
是list<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...
}