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 的作用。