簡體   English   中英

聲明一個固定大小的字符串

[英]Declaring a string of fixed size

在 C 中我們做

char buffer[100];

有沒有辦法聲明一個固定大小的std::string

您可以像這樣使用string::reserve方法

  std::string s;
  s.reserve(100);

但這不是固定大小,因為您可以使用 string::push_back 向字符串添加更多字符。

在 c++17 中,將有std::string_view提供與std::string相同的(不可變的)接口。

同時,您可以包裝一個 char 數組並向其中添加您選擇的任何服務,例如:

template<std::size_t N>
struct immutable_string
{
    using ref = const char (&)[N+1];
    constexpr immutable_string(ref s)
    : s(s)
    {}

    constexpr auto begin() const { return (const char*)s; }
    constexpr auto end() const { return begin() + size(); }
    constexpr std::size_t size() const { return N; }
    constexpr ref c_str() const { return s; }
    ref s;

    friend std::ostream& operator<<(std::ostream& os, immutable_string s)
    {
        return os.write(s.c_str(), s.size());
    }
};

template<std::size_t NL, std::size_t NR>
std::string operator+(immutable_string<NL> l, immutable_string<NR> r)
{
    std::string result;
    result.reserve(l.size() + r.size());
    result.assign(l.begin(), l.end());
    result.insert(result.end(), r.begin(), r.end());
    return result;
}

template<std::size_t N>
auto make_immutable_string(const char (&s) [N])
{
    return immutable_string<N-1>(s);
}

int main()
{
    auto x = make_immutable_string("hello, world");
    std::cout << x << std::endl;

    auto a = make_immutable_string("foo");
    auto b = make_immutable_string("bar");
    auto c = a + b;
    std::cout << c << std::endl;
}

Boost 1.66開始:模擬std::basic_string接口的非分配字符串。

我不知道你想做什么,但是有一個std::array<char, 100> buffer; 你應該做得很好。

然后你可以得到這樣的字符串:

std::string str(std::begin(buffer),std::end(buffer);

檢查這個https://github.com/m3janitha/fixed_size_string 你可以替換char buffer[n]; 使用fss::fixed_size_string<n> buffer;

您可以使用std::array ,這是 C++ 方法,可以完全按照您在 C 中所做的操作。

std::array<char, 100> buffer;

如果您擔心由於緩沖區大小過大而導致堆棧溢出(例如,如果1001'000'000的替代品),您可以動態分配它。

std::unique_ptr<std::array<char, 100>> buffer = std::make_unique<std::array<char, 100>>();

由於您的接口將char *作為其操作數,並且此對象允許您在運行時查詢其大小,因此應該就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM