2012-02-29 3 views
0

다음 상황에서 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... 
} 

이 호출되는 방법은 myObjlist<MyObj>::iterator이고, myFunction(&(*myObj));입니다. 이것을 작성하는 더 깨끗한 방법이 있습니까?

+3

'sortMyVectors (myVectors, * myObj); "myVectors"는 변수이므로 직접 참조로 전달할 수 있습니다. 'myObj'는 포인터이므로,'MyObj '와 호환되도록 포인터를 한 번 역 참조 할 필요가 있습니다. – dasblinkenlight

+0

어떤 오류가 발생합니까? 설명을 위해 – dasblinkenlight

+0

Thx."sortMyVectors (std :: vector <_Vector2, std :: allocator <_Vector2>>, & MyObj &)'" " – Ben

답변

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

답변 :

sortMyVectors(myVectors, *myObj); 

당신이 몇 가지 기본적인 문제가있는 것으로 포인터를 사용하여 (그리고 이것이 숙제에 대한 연습이라고 생각합니다), 아마도 당신이 반복자를 배우기에는 너무 진보 된 것이지만 나중에 살펴보아야합니다 std::sort으로 처리 할 수 ​​있습니다.

MyObj* myObjPtr = ...; 

이것은 포인터 : 포인터의 이해를 개선하기위한 시도로

. 메모리 주소를 가리 킵니다. 유효한 하나를 가리키는 가정 할 때, 우리는이 작업을 수행 할 수 있습니다

MyObj& myObjRef = *myObjPtr; 

이제 우리는 pointee를 얻기 위해 포인터를 역 참조와 포인터처럼도하지만 (포인터/pointee의 구별을 숨 깁니다 참조로 할당 pointee/참조 된 개체에 액세스하기 위해 연산자 *가 필요하지 않음). 댓글에 대응

당신이 만든 :

The "sorting" basically sorts these vectors by their distance from another vector, but only in a particular case, so I don't know if there is a standard way of doing that..

표준 : 종류의 (에서 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을 사용하여 어떤 조건 으로든 항목을 정렬 할 수 있습니다.

+0

설명을위한 Thx, 빠른 질문, 생성자에 paramater'const MyObj & myObj'가있는 경우 어떻게해야합니까? 이것을 데이터 멤버'MyObj * myObj' (위의 설명과 반대의 정렬)에 할당하십시오. 또는 데이터 멤버를 변경해야합니까? – Ben

+0

@Ben 간략한 답변 : const 참조가 읽기 전용이고 MyObj *가 변경 가능하기 때문에 당신은 할 수 없습니다. 그것은 당신이 원하지 않는 실수로 물건을 수정하지 못하도록 const 안전의 요점을 위반합니다. const MyObj * 인 경우 다음을 수행 할 수 있습니다. const MyObj * myObjPtr = & myObjRef; – stinky472

+0

@Ben 거친 말로 말해서, 그것은 포인터 인에서 포인터로, 연산자 *는 pointee에서 포인터로 이동하는 연산자입니다. – stinky472

2

정렬을 다시 수행하지 않으려면 std::sort을 사용하여 MyObj과 같은 조건부 개체를 전달할 수 있습니다. 정렬하려면 operator()이 있어야합니다. 더 많은 유연성을 제공하는 컨테이너가 아닌 반복자를 사용합니다. 그냥 myFunction이이 myObj로하고 myVectors 전달 sortMyVectors 호출 할 경우

+0

"정렬"은 기본적으로 이러한 벡터를 다른 벡터와의 거리를 기준으로 정렬하지만 특정 경우에만 정렬하므로 표준 방법이 있는지 여부는 알 수 없습니다. 그러나 내 질문은 포인터를 넣을 필요가 있니? – Ben

0

다음을 수행하십시오

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

글쎄, 널 포인터 체크를 할 필요가없는 그런 참조를 지금 사용하고 있습니다.) – Ben