вектор <string>или вектор <char *>? - PullRequest
4 голосов
/ 15 февраля 2009

Вопрос:

  • Что такое разница между:

    • vector<string> и vector<char *>?
  • Как передать значение типа данных: string в функцию, которая специально принимает:

    • const char *

Для Экземпляр :

 vector<string> args(argv, argv + argc);

 vector<string>::iterator i;

 void foo (const char *); //*i
  • Я понимаю, используя vector<char *>: мне придется скопировать данные, а также указатель

Edit:

Спасибо за ввод!

Ответы [ 7 ]

17 голосов
/ 15 февраля 2009

Это действительно не имеет ничего общего с векторами.

A char* - указатель, который может указывать или не указывать на допустимые строковые данные.

A std::string - это класс строк, инкапсулирующий все необходимые данные, составляющие строку, а также функции выделения и освобождения.

Если вы храните std::string в векторе или где-либо еще, тогда все будет просто работать .

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

И так как char* ожидаются многими API C, а также частью стандартной библиотеки C ++, класс string имеет функцию c_str(), которая возвращает char*.

3 голосов
/ 21 декабря 2010

char* на самом деле является указателем на значение типа char, которое определяет, что можно и что нельзя делать с этим значением. Вы можете сделать так, чтобы int* number и number ссылались на указатель на блок памяти, в котором хранится это значение, и предполагали, что это int, и заблокировали этот тип для этого блока памяти. Но вы можете сохранить char 'C' в этом блоке памяти, но он выдаст ошибку компиляции, потому что он говорит, что вы не можете выполнять эти int функции на этом char.

3 голосов
/ 15 февраля 2009

Чтобы передать string чему-то ожидающему const char *, используйте c_str() член string, который возвращает строку с нулевым символом в конце:

string s = "foobar";

int n = strlen( s.c_str() );
1 голос
/ 15 февраля 2009

Я бы использовал vector< string > только потому, что поиск будет основан на значении, а не на адресе. Однако vector< char* > будет быстрее, поэтому у каждого есть свои преимущества.

1 голос
/ 15 февраля 2009

С http://www.cplusplus.com/reference/string/string/:

Объекты String - это особый тип контейнер, специально разработанный для работать с последовательностями символов.

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

char* - указатель на символ, не более того.

Вы можете использовать c_str() для передачи данных, которые требуются как const char*.

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

1 голос
/ 15 февраля 2009
foo(i->c_str());
0 голосов
/ 21 марта 2013

vector<char *> звучит как плохая идея !! Если ваша программа не работает в системе с ограниченным объемом памяти.

...