Передача вектора в функцию (указатели / адреса) - PullRequest
0 голосов
/ 29 февраля 2012

В следующей ситуации, как должен выглядеть список параметров для 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. Есть ли более чистый способ написать это?

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012
sortMyVectors( ???-myVectors, ???-myObj);

Ответ:

sortMyVectors(myVectors, *myObj);

Поскольку в данный момент у вас возникли некоторые базовые проблемы с указателями (и я подозреваю, что это практическое задание для какой-то домашней работы), вероятно, было бы слишком сложно предложить учить итераторы, но вам следует изучить это позже, наряду с std::sort, что было бы довольно трудно победить при любой сортировке с ручным управлением.

Как попытка улучшить ваше понимание указателей:

MyObj* myObjPtr = ...;

Это указатель. Это указывает на адрес памяти. Предполагая, что он указывает на действительный, мы можем сделать это:

MyObj& myObjRef = *myObjPtr;

Теперь мы разыменовали указатель, чтобы получить указатель, и присвоили его ссылке, которая также похожа на указатель, но скрывает различие между указателем / указателем (не требуя оператора * для доступа к объекту указатель / ссылка).

В ответ на ваш комментарий:

"Сортировка" в основном сортирует эти векторы по их расстоянию от другой вектор, но только в конкретном случае, поэтому я не знаю, если есть стандартный способ сделать это ..

std :: sort принимает строгий предикат слабого порядка (в основном это функция или функциональный объект, который возвращает true / false в зависимости от того, 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);

Приведенный выше код сортирует строки на основе их длины от самой короткой строки до самой длинной строки, а не по умолчанию (оператор по умолчанию <реализация для строк), сортировка их по строковому порядку (в алфавитном порядке, грубо говоря). </p>

Учитывая эту возможность определять свой собственный предикат для сравнения объектов, вы можете в принципе сортировать что угодно по любому условию, используя std::sort.

2 голосов
/ 29 февраля 2012

Не изобретайте сортировку заново, используйте std::sort, которая позволяет передавать объект-предикат, такой как MyObj, если у него есть operator() для сортировки.Он использует итераторы, а не контейнеры, что дает большую гибкость.

0 голосов
/ 29 февраля 2012

Если вы просто хотите, чтобы 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... 
    }
...