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

    +15

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    static std::vector<std::string> listSubstring(std::string stringData, std::string separator)
    {
    	std::vector<std::string> result;
    	std::size_t found = stringData.find(separator);
    	if (found==std::string::npos)
    	{
    		result.push_back(stringData);
    		return result;
    	}
    	result.push_back(stringData.substr(0,found));
    	std::vector<std::string> ko=listSubstring(found+separator.length(),separator);
    	for (std::vector<std::string>::iterator i = ko.begin(); i != ko.end(); ++i)
    		{result.push_back(*i);}
    	return result;
    
    }

    Запостил: laMer007, 24 Декабря 2013

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

    • Ответить
    • разделяй и жди
      хаскелисты отакэ
      Ответить
    • O(n²)
      Ответить
    • Надеюсь, компилятор делает return value optimization.

      Хотя очень даже СТЛненько: копия на копии и копией погоняет.
      Ответить
      • по всем канонам должно быть NRVO, только алгоритм от этого не менее квадратичен.
        Ответить
    • полную реализацию в студию! моя голова отказывается компилировать строку №11.
      Ответить
      • В строке 11 мы видим рекурсивный вызов listSubstring() на оставшемся куске строки с сохранением результата в переменную ko.
        Ответить
        • > рекурсивный вызов listSubstring()
          std::size_t found
          Ответить
          • ага. либо было что-то из ГК удалено, либо какая глобальная "вкуснятина" где-то еще скрывается.
            Ответить
          • Упс ;) Ну тогда да, вторую перегрузку забыли кинуть...

            Только как она будет работать, если ей строка никак не передается?)
            Ответить
    • в 11 строке должно быть std::vector<std::string> ko=subStrings(stringData.substr(found+se parator.length()),separator);
      roman-kashitsyn >> как было бы более правильно?
      Ответить
      • Всё зависит от того, можно ли юзать буст
        http://www.boost.org/doc/libs/1_39_0/libs/tokenizer/char_separator.htm
        Ответить
      • Ну вот как-то так например, если нельзя юзать либы:
        static std::vector<std::string> listSubstring(const std::string &stringData, const std::string &separator)
        {
            std::vector<std::string> result;
            std::size_t pos = 0, end;
            while ((end = stringData.find(separator, pos)) != std::string::npos) {
        	result.push_back(stringData.substr(pos, end-pos));
                pos = end + separator.size();
            }
            result.push_back(stringData.substr(pos));
            return result;
        }
        Ответить

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