Answers:
使用C ++ 11,您可以这样做,std::string(v.data())
或者如果向量'\0'
的末尾不包含,则可以这样做std::string(v.data(), v.size())
。
string(&v[0], v.size())
应该也行,但只有后assert(not v.empty());
,因为如果向量为空,v[0]
并v.front()
会调用未定义的行为。除了不必使用address-of运算符的语法简单性之外,这是C ++ 11 data()
函数的真正好处,该函数甚至可以在空向量上运行。
std::string(v.data())
可能导致更长的字符串。所以不要使用这种方式。
std::string(v.data(), v.size())
,正是出于这个确切原因在答案中提到了?
只是为了完整性,另一种方法是std::string(&v[0])
(尽管您需要确保您的字符串以null结尾,std::string(v.data())
并且通常是首选的。
不同之处在于,您可以使用前一种技术将向量传递给要修改缓冲区的函数,而使用.data()则不能。
data()
修改缓冲区?在我看来,如果您调用data()
非const向量,它将返回a T *
(如果您的向量为const,则“ v [0]`仍将返回” T const &
)。
v
是字符串,那将是正确的,但是目标类型是字符串并且v
是向量。(但很高兴看到C ++ 17将使字符串与向量保持奇偶校验。)
我喜欢Stefan的回答(13年9月11日),但想使其更强一点:
如果向量以空终止符结尾,则不应使用(v.begin(),v.end()):应使用v.data()(对于C ++ 17之前的版本,则为&v [0]) 。
如果v没有空终止符,则应使用(v.begin(),v.end())。
如果您使用begin()和end()并且向量确实有一个终止的零,则最终将得到一个字符串“ abc \ 0”,该字符串的长度为4,但实际上应该仅为“ abc”。
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))
与std::string
新事物具有相同的作用,但具有a 的作用。