safe char* array используя STL классы
От: j s p Украина  
Дата: 27.09.07 15:08
Оценка:
Есть вопрос, какая конструкция более приемлима/безопасней/эффективней для ф-й вида

void f(char*, int); // и т.п.


1. std::string (A)
  string s;
  s.reserve(nLength); // resize()?
  char* p = const_cast<char*>(s.data());
  f(p, nLength);


2. std::string (B)
  string s;
  s.reserve(nLength); // resize()?
  f(&s[0], nLength);


3. std::vector
  vector<char> s;
  s.reserve(nLength); // resize()?
  f(&s[0], nLength);


4. другой вариант
Re: safe char* array используя STL классы
От: Аноним  
Дата: 27.09.07 15:15
Оценка:
Здравствуйте, j s p, Вы писали:

JSP>Есть вопрос, какая конструкция более приемлима/безопасней/эффективней для ф-й вида


1) в твоем случае не reserve а resize. reserve в общем случае нельзя использовать для задания размера массива — это функция-"подсказка"

2) везде, где это возможно умные люди советут применять vector.
Не вижу проблем с

vector<char> v;
v.resize( length + 1 );
f( &v[0], length );


should work
Re[2]: safe char* array используя STL классы
От: j s p Украина  
Дата: 27.09.07 15:28
Оценка: -1
Здравствуйте, Аноним, Вы писали:


А>should work


Камрад, да они все рабочие, меня интересует мнения и оценки о приемлимости/безопасности/эффективности.
А так как в меру своих знаний, пока оных сделать не могу, хочется узнать у знающих людей.
Re[3]: safe char* array используя STL классы
От: Sergey Россия  
Дата: 27.09.07 15:56
Оценка:
> Камрад, да они все рабочие, меня интересует мнения и оценки о приемлимости/безопасности/эффективности.
> А так как в меру своих знаний, пока оных сделать не могу, хочется узнать у знающих людей.

Вас не смущает, что вектор и строка получаются у вас нулевой длины?
В любом случае, то, что они у вас работают — всего лишь один из вариантов неопределенного поведения. Возмете другую версию STL — и первые два варианта запросто могут перестать работать Третий вариант, строго говоря, тоже работать не обязан, но вряд ли не будет работать на практике. А вообще, если не ищете себе приключений — сделайте так, как вам тут аноним советовал.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: safe char* array используя STL классы
От: quodum  
Дата: 27.09.07 16:01
Оценка:
Здравствуйте, j s p, Вы писали:

JSP>Есть вопрос, какая конструкция более приемлима/безопасней/эффективней для ф-й вида


С точки зрения стандарта верен только вариант с вектором.

На практике будут работать и варианты со стрингом, если, как уже отметили, заменить reserve на resize. Однако это ничем не гарантируется.
Re[2]: поправка
От: quodum  
Дата: 27.09.07 16:03
Оценка:
Здравствуйте, quodum, Вы писали:

Заменить reserve на resize нужно, естественно, и в варианте с вектором. Проглядел.
Re: safe char* array используя STL классы
От: Аноним  
Дата: 27.09.07 16:41
Оценка:
Насчет 1 и 2 — стандартом не сказано что std::string должен хранить символы строго последовательно в памяти. Хотя многие реализации STL делают так (но не все и не всегда!)
3 — совершенно безопасен с точки зрения стандарта.
Re: safe char* array используя STL классы
От: Аноним  
Дата: 27.09.07 18:53
Оценка:
Здравствуйте, j s p, Вы писали:

Если твоя ф-ция модифицирует передаваемую строку (а судя по тому, что первый параметр указатель на не константу, то так оно и есть)
JSP>
JSP>void f(char*, int); // и т.п.
JSP>

и изменения должны быть сохранены в s, то правильным есть только вариант с вектором.
Или я не понял сути вопроса.
Re: safe char* array используя STL классы
От: pavel_turbin  
Дата: 27.09.07 23:00
Оценка:
Не забудте на 0 длину проверить. Иначе вектор по ассерту грохнется на &a[0].
Re: safe char* array используя STL классы
От: Alexey Borodin alexey-borodin@narod.ru
Дата: 28.09.07 04:02
Оценка:
Здравствуйте, j s p, Вы писали:

JSP>4. другой вариант


void GetString(std::tstring& str)
{
    str = _T("Hello!");
}
Re[2]: safe char* array используя STL классы
От: j s p Украина  
Дата: 28.09.07 06:56
Оценка:
Здравствуйте, pavel_turbin, Вы писали:

_>Не забудте на 0 длину проверить. Иначе вектор по ассерту грохнется на &a[0].


В смысле? Это в каком месте?
Re[3]: safe char* array используя STL классы
От: pavel_turbin  
Дата: 28.09.07 23:58
Оценка:
Здравствуйте, j s p, Вы писали:

JSP>Здравствуйте, pavel_turbin, Вы писали:


_>>Не забудте на 0 длину проверить. Иначе вектор по ассерту грохнется на &a[0].


JSP>В смысле? Это в каком месте?


  vector<char> s;
  s.resize(0); 
  &s[0]; // assert: "vector subscript out of range"
Re: safe char* array используя STL классы
От: _nn_ www.nemerleweb.com
Дата: 04.10.07 23:38
Оценка:
Здравствуйте, j s p, Вы писали:

JSP>Есть вопрос, какая конструкция более приемлима/безопасней/эффективней для ф-й вида


<skip>

JSP>4. другой вариант


Для таких функций соорудил небольшой велосипед
Автор: _nn_
Дата: 10.09.06
.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.