С++ фиксированная длина строки?

Есть ли что-нибудь подобное в стандартном С++/STL? В идеале он должен быть построен как

fstring s = fstring(10);

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

Edit:

Обратите внимание, что размер известен только во время выполнения и отличается от одного к другому. Но все fstring должны знать, как работать вместе и иметь все фантазии string.

Ответ 1

Ближайшее приближение сегодня boost::array<char, 10>

Ответ 2

Использовать, например.

std::tr1::array<char, 10>

Ответ 3

Как насчет наследования std::string конфиденциально, а затем выставляя меньший интерфейс с помощью using и записывая собственный < и → функции?

Ответ 4

Почему бы не использовать std:: basic_string из STL в качестве фиксированного класса строк?

Вы можете использовать конструктор

basic_string(
   size_type _Count,
   value_type _Ch,
   const allocator_type& _Al = Allocator ( )
);

в качестве инициализатора.

Редактировать позже: Пример:

std::string my10CharStringInitializedWithSpace( 10, ' ');

Ответ 5

Вероятно, что-то в boost, которое обеспечивает это (ближайший я лично видел Boost.Array, которого недостаточно). Однако, если вы просто хотите моделировать "важное подмножество" std::string, сделать не эквивалент фиксированной длины не очень сложно:

template <size_t N>
class fixed_string
{
    // ... interface looks like std::string
};

Для всех, кто спрашивает о том, зачем вообще этого делать, основное преимущество заключается в том, чтобы избежать выделения памяти, не теряя большую часть полезного API std::string. Если есть другой способ сделать это с помощью std::allocator, мне было бы интересно узнать.

Ответ 6

Я использовал что-то подобное для строк, выделенных в стеке или как часть другого объекта. Что в релизе становится char *

#ifdef DEBUG
#define STR_DEBUG
#endif

#define FIXED_STRING( maxSize ) ReservedString<maxSize> _Tmp##__LINE__; 

class FixedString{
public:
    FixedString& operator =( char const * const pStr );
    //FixedString& operator =( FixedString const &pStr );
    operator const char*() const { return mStr; }
    const char* cStr() const { return mStr; }
    FixedString& operator +=(const char *pStr);
    bool equals( const char *pStr );
    bool beginsWith( const char *pStr );
    /// rises ASSERT if not enough
    void ensureEnoughForNMore( int NMoreSymbols );
protected:
    char *mStr;
    #ifdef STR_DEBUG
        ui16 mMaxLength;
    #endif

private:
    #ifdef STR_DEBUG
        FixedString( char *str, ui16 maxLength ): mStr(str), mMaxLength(maxLength) {}
    #else
        FixedString( char *str ): mStr(str) {}
    #endif
    template<int>
    friend  class ReservedString;
};

template <int MAX_LENGTH> class ReservedString{
public:
    operator FixedString() { 
        #ifdef STR_DEBUG
            return FixedString( mBuf, MAX_LENGTH );
        #else
            return FixedString( mBuf );
        #endif
    }   
private:
    char mBuf[MAX_LENGTH+1];
};

Ответ 7

С С++ 11 можно перейти на

std::array<char,10> s;

Также эквивалент std::string всегда можно построить, когда требуется

std::string s2(std::begin(s), std::end(s));

Ответ 8

Символьный массив стиля С.

char label[10] = "a string";

Ответ 9

Если я правильно вас понимаю, вы не хотите использовать std::string, потому что вы беспокоитесь, что он может бесшумно расширяться. Я вижу пару вариантов:

  • Используйте строчную строку C-стиля и функции из cstdio, которые принимают аргумент длины (например, fgets).

  • Используйте std::vector<char>.