使用大括号/括号将值分配给标准::字符串

Assign value using curly braces/bracket to std::string

本文关键字:标准 字符串 分配      更新时间:2023-10-16

如果这是有效的:

unsigned char buffer[] = {
 0x01, 0x02, 0x03, 0x04
};

这是否也适用于 std::string,例如

std::string buffer = {
 0x01, 0x02, 0x03, 0x04
};

如果没有,如何插入此类值?

不在 C++03 中,但您可以在 C++011 中执行此操作:

 std::string buffer = { 0x01, 0x02, 0x03, 0x04 }; //C++011 ONLY

演示 : http://www.ideone.com/1cOuX。在演示中,我使用了可打印字符('A''B'等)只是为了演示。


在 C++03 中,由于 @andrewdski 给出的解决方案确实很丑陋,因此您可以改为这样做:

    unsigned char values[] = {0x01, 0x02, 0x03, 0x04 };
    std::string buffer(values, values + sizeof(values));

这是一种更干净的方法。 如果您想稍后添加更多值,则可以这样做:

unsigned char more_values[] = {0x05, 0x06, 0x07, 0x08 };
buffer.insert(buffer.end(), more_values, more_values+ sizeof(more_values));

如果你想从其他std::string添加值,那么你可以这样做:

//add values from s to buffer
buffer.insert(buffer.end(), s.begin(), s.end());

这与:

buffer += s; //cool 

顺便说一下,除了其他有趣的事情之外,您还可以编写一个名为 join 的小实用程序来做到这一点:

std::string s = join() + 'A' + 'B' + 'C' + 'D';

您甚至可以在单个join语句中混合使用不同类型的语句,如下所示:

std::string s = join() + 'A' + 'B' + 'C' + 'D' + "haha" + 9879078;

即使在C++011 {}方法中也不可能做到这一点。

该实用程序及其完整演示如下所示:

#include <iostream>
#include <string>
#include <sstream>
struct join
{
   std::stringstream ss;
   template<typename T>
   join & operator+(const T &data)
   {
        ss << data;
        return *this;
   }
   operator std::string() { return ss.str(); }
};
int main() {
        std::string s1 = join() + 'A' + 'B' + 'C' + 'D';
        std::cout << s1 << std::endl;
        std::string s2 = join() + 'A' + 'B' + 'C' + 'D' + "haha" + 9879078;
        std::cout << s2 << std::endl;
}

输出:

ABCD
ABCDhaha9879078

在线演示 : http://www.ideone.com/3Y7pB

但是,此实用程序需要使用要插入到字符串的特定值进行强制转换,如下所示:

std::string buffer=join()+ (char)0x01 +(char)0x02 + (char)0x03 + (char)0x04;

诚然,没有那么酷。需要强制转换,否则每个值将被视为您不需要int类型。因此,我主张采用前面所示的更清洁的方法。但是此实用程序可以在其他情况下为您提供帮助。有时尝试使用C++运算符和功能是件好事。:D

std::string buffer = "x01x02x03x04"

有点丑,但它有效。