2013-09-15 6 views
-5

Рассмотрим мы объявили строку, как это: string x; и вектор символов, как это: vector<char> x_vec; Я думаю, если есть какие-либо преимущества делатьЧто происходит, когда мы делаем cout << string?

cout<<x; 

За

for(int i=0;i<x.length();i++) 
     cout<<x[i]; 

Или

for(int i=0;i<x_vec.size();i++) 
     cout<<x_vec[i]; 

в производительность? Я хочу сказать, что очень часто мы добираемся до точки, где мы должны выбирать между string и vector s символов. Является ли первый пример фактически обработанным или приближенным к программе иначе, чем другие примеры?

+1

Что именно вы делаете, когда вам часто приходится выбирать между строками и векторами? –

ответ

1

Существует явное преимущество использования

out << str; 

над петлями написания символов invidivually: отформатированных операторов вывода, в том числе для char создать std::ostream::sentry объект для каждого выхода. Кроме того, поскольку поток не знает, что вы просто написали персонаж потока, ему нужно перепроверить его внутреннее состояние. Если вы хотите, чтобы профиль написания последовательностей символов по сравнению с выше форматированного вывода, вы должны использовать что-то вроде

out.write(str.c_str(), str.size()); 

или

std::copy(str.begin(), str.end(), std::ostreambuf_iterator<char>(out)); 

Я бы ожидать, что форматированный вывод и версию с помощью write() около одна и та же производительность и vesion с использованием std::copy(), вероятно, медленнее, хотя нет веской причины, что она должна быть медленнее, чем стандартные библиотеки C++, не мешая созданию быстрой реализации: я знаю, что это можно сделать эффективно, главным образом потому, что я сделал это для мой experimental standard C++ library implementation.

6

Моя точка зрения состоит в том, что очень часто мы добираемся до точки, где мы должны выбирать между строками и векторами символов.

Очень часто? Я так не думаю.

Если что-то принципиально является строкой, просто используйте std::string.

Если и когда вы можете доказать, что производительность является субоптимальной (обычно путем профилирования вашей программы на реальных данных), тогда рассмотрите альтернативы. std::vector<char> - одна из таких альтернатив, но есть и другие. Какой, если таковой будет, предпочтительнее, зависит от фактического варианта использования.

По всей видимости, это будет незадолго до того, как вы столкнетесь с убедительным реальным случаем для замены std::string на std::vector<char>.

1

Существует петля во всех трех случаях - в первом случае она находится внутри реализации operator <<, которая вызывает ОС, которая выполняет цикл, а в двух других случаях - в вашем коде.

Последние два случая идентичны с точки зрения производительности, если не с точки зрения сгенерированного кода: обе строки и векторы используют непрерывное хранение, поэтому их operator [] s являются чрезвычайно быстрыми.

Первый случай, когда цикл принадлежит реализации оператора, может быть оптимизирован лучше, когда реализация перейдет в базовую операционную систему. Однако самый важный момент - читаемость: одна строка с простым выражением всегда читается лучше, чем простой цикл.

В общем случае наибольшая разница между строками и векторами char s - это набор примитивов, поддерживаемых двумя контейнерами: строки ориентированы на передачу строковой семантики (делая подстроки, простые поиски), в то время как векторы лучше передать массивную семантику (последовательные коллекции элементов с быстрым доступом к произвольному индексу). С точки зрения производительности, две структуры очень похожи.

Смежные вопросы