2010-04-02 3 views
0

как работает его функция быстрее, чем cstring? является аналогичным источником, доступным для C?Строковый алгоритм поиска, используемый строкой :: find() C++

+4

Почему, по вашему мнению, это быстрее? – 2010-04-02 23:13:14

+0

Можете ли вы опубликовать код, который использовался во время относительной скорости? Возможно, вы действительно видите разницу в своей тестовой структуре, а не в базовом коде. –

+1

Вы не можете обсуждать скорость, не обсуждая реализацию библиотек C и C++ (соответственно) и компиляторов C++ и C (соответственно). C89, C99, C++ 0x и т. Д. Являются стандартами, которые определяют, как должны быть реализованы языки. Когда говорят о «С» или «С ++», он имеет в виду язык вообще и никакой конкретной реализации. Не ссылаясь на вашу _platform_, мы даже не можем ответить на ваш вопрос? – 2010-04-02 23:32:39

ответ

3

Нет стандартной реализации стандартной библиотеки C++, но вы должны иметь возможность взглянуть на реализацию, поставляемую вместе с вашим компилятором, и посмотреть, как она работает самостоятельно.

В общем, большинство функций STL не быстрее, чем их аналоги C. Они обычно более безопасны, более обобщены и предназначены для обеспечения гораздо более широкого круга обстоятельств, чем узкоцепочечные С-эквиваленты.

+3

Любая функция STL, которая принимает функторы, обычно будет быстрее, чем C, которые принимают указатели на функции. Например, 'std :: sort' и' std :: binary_search' значительно быстрее, чем 'qsort' и' bsearch', включенные в стандартную библиотеку C. –

+2

Нет такой вещи, как «двоичная» версия STL с близким исходным кодом. Никто не реализовал экспортируемые шаблоны, каждый должен отправить исходный код для своей реализации STL. Включая Dinkumware. –

+0

Полезно знать. Я отредактировал ответ соответственно, спасибо. Однако у Codo C++ нет экспортируемых шаблонов? Я думал, что это единственный компилятор, который фактически реализовал его. –

1

Стандартная оптимизация с любым строковым классом заключается в том, чтобы сохранить длину строки вместе со строкой. Который сделает любую строковую операцию, которая требует, чтобы длина строки была известна как O (1), а не O (n), strlen() была очевидной.

Или, копируя строку, в фактической копии нет усиления, но выясняется, сколько памяти выделяется до того, как копия будет равна O (1). Общий алгоритм по-прежнему равен O (n). Основная операция по-прежнему остается прежней, перетаскивание байтов занимает столько же времени на любом языке.

Строковые классы полезны, потому что они более безопасны (сложнее снимать ногу) и проще в использовании (требуется менее явный код). Они стали популярными и широко используются, потому что они не были медленными.

0

Класс string почти наверняка хранит гораздо больше данных о строке, чем вы найдете в строке C. Хорошим примером является длина. В компромиссе для дополнительного использования памяти вы получите несколько запасных циклов процессора.

Редактировать: Однако маловероятно, что он существенно медленнее, чем другой, поскольку они будут выполнять принципиально те же действия. MSDN предполагает, что string :: find() не использует систему на основе функтора, поэтому у них не будет такой оптимизации.

0

Есть много возможностей, как вы можете реализовать технику поиска. Самый простой способ - проверить каждую позицию строки назначения, если есть строка поиска. Вы можете закодировать это очень быстро, но это самая медленная возможность. (O (m * n), m = строка поиска длины, строка длины n = длина)

Посмотрите страницу wikipedia, http://en.wikipedia.org/wiki/String_searching_algorithm, представлены различные варианты. Самый быстрый способ - создать конечный конечный автомат, а затем вы можете вставить строку, не обращаясь назад. То тогда просто O (n).

Какой алгоритм использует STL, я не знаю. Но вы можете искать исходный код и сравнивать его с алгоритмами.