1. C++ / Говнокод #10317

    −23

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    bool strictlyLess(std::vector<int> v1, std::vector<int>v2) { // v1 < v2
    	bool strictly = false;
    	for(int i = 0; i < v1.size(); i++) {
    		if(v1[i] > v2[i]) {
    			return false;
    		}
    		if(v1[i] < v2[i]) {
    			strictly = true;
    		}
    	}
    	return strictly;
    }

    Запостил: movaxbx, 18 Мая 2012

    Комментарии (17) RSS

    • Из говнокода вижу только непроверенный v2.size().
      Ответить
      • Но вектор (1, 2, 3), например, оно считает строго меньше вектора (3, 2, 5)
        Ответить
        • Ну все зависит от цели этой функции. Для сортировки ее использовать конечно нельзя, но для какой-то цели может понадобиться такое сравнение.
          Ответить
        • Можно придумать что-нибудь вроде: задача оптимизации, на v1 натянут гиперпараллелепипед, проверяется что v2 ограничен им, но не в точке оптимума (но тогда одно =< в цикле, а затем проверка на == - выглядят лучше).

          Кстати, как в плюсах аналог python2 cmp(a,b) делают?
          Ответить
      • т.е. передача копий векторов вместо ссылок не смущает?

        и да, раз уж strictly, то как это вяжется с допущением v1[i] == v2[i]

        реализовано крайне плохо, второе условие не нужно, первое должно быть >=, проверка за выходы за границы обязательна
        не верю что production code
        Ответить
        • >т.е. передача копий векторов вместо ссылок не смущает?
          [trololomode: on]
          Внезапно никакого копирования:
          strictlyLess(move(v1),move(v2));

          http://ideone.com/OtITL
          [trololomode: default]

          "Warning: default synonym as on"
          Ответить
          • внезапно бггг
            http://ideone.com/eUMqk
            Ответить
            • и да, конечно же после первого же std::move(v1) вектор v1 станет пустым
              http://ideone.com/FSTzi
              Ответить
              • >и да, конечно же после первого же std::move(v1) вектор v1 станет пустым
                И что? Вас это пугает? Всё в соответствии со стандартом.
                Ответить
            • >внезапно бггг
              И чего вы вдруг не ожидали? Всё в соответствии со стандартом.
              Ответить
        • >второе условие не нужно
          Как это не нужно? Если поменять первое на >= а второе убрать, то на случае (1,2,3) (1,2,4) он вернет false, а оригинальный код возвращал true.

          Насчет проверки и const ссылок согласен.
          Ответить
    • По этой функции
      (1,2)<(2,1) == false
      (2,1)<(1,2) == false
      Удачной сортировки!
      Ответить
      • А кто сказал что это лексикографическое сравнение, и автор будет использовать его для сортировки? :)
        Ответить
      • Такой вопрос мог возникнуть только от незнания основ крестов. Переопределять компаратор или подавать параметр для функции сортировки не обязательно в таком случае.
        http://ideone.com/5xC08

        #include <iostream>
        #include <algorithm>
        #include <iomanip>
        #include <vector>
         
        using namespace std;
         
        int main() {
                vector<int> a={1,30}, b={8,4,1};
                cout<<boolalpha<<(a<b)<<endl;
                sort(a.rbegin(), a.rend());
                cout<<boolalpha<<(a<b)<<endl;
                return 0;
        }


        И сортировать контейнер векторов... Это мощно!
        Ответить

    Добавить комментарий