[英]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;
如果您擔心由於緩沖區大小過大而導致堆棧溢出(例如,如果100
是1'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.