除了首先构建C风格的字符串,然后使用它来创建std::string之外,是否有更快/替代/“更好”的方法可以从字符向量初始化一个字符串?
除了首先构建C风格的字符串,然后使用它来创建std::string之外,是否有更快/替代/“更好”的方法可以从字符向量初始化一个字符串?
好的,最好的方法是使用以下构造函数:
template<class InputIterator> string (InputIterator begin, InputIterator end);
这将会导致类似于以下的结果:
std::vector<char> v;
std::string str(v.begin(), v.end());
我认为你可以这样做
std::string s( MyVector.begin(), MyVector.end() );
其中 MyVector 是您的 std::vector。
_ITERATOR_DEBUG_LEVEL=1
(在这种情况下,它似乎可以正常工作)。 - Cameron使用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()
都会引发未定义的行为。除了语法上不需要使用地址运算符的简单之外,这就是C++11的 data()
函数的真正好处,即使对于空向量也能正常工作。 - Adam H. Petersonstd::string(v.data())
可能会导致更长的字符串。因此不要使用这种方法。 - heLomaNstd::string(v.data(), v.size())
有什么问题?答案中明确提到了这个方法。 - Sz.std::string s(v.begin(), v.end());
v可以是任何可迭代的东西。(具体来说,begin()和end()必须返回InputIterators。)
(v.begin(), v.end())
和 (v.data())
之间有性能差异吗?后者会是 O(n)
吗? - 김선달为了完整起见,另一种方法是std::string(&v[0])
(虽然您需要确保字符串以空字符结尾,并且通常应优先使用std::string(v.data())
)。
区别在于您可以使用前一种技术将向修改缓冲区的函数传递向量,而不能使用.data()。
data()
修改缓冲区?在我看来,如果你在非 const 的向量上调用 data()
,它将返回一个 T *
(如果你的向量是 const,'v[0]无论如何都会返回一个
T const &`)。 - Adam H. Petersonv
是一个字符串,那么这将是正确的,但目标类型是一个字符串而 v
是一个向量。(但很高兴看到C++17将为字符串和向量提供相同的功能。) - Adam H. Peterson std::vector<char> vc {'l', 'o', 'v', 'e', '\0', '\0', '\0'};
std::string sCat(vc.cbegin(), vc.cend());
std::cout << sCat << "|---" << '\n';
std::cout << sCat.size() << "|---" << '\n';
std::cout << "------------" << '\n';
std::string sCat2(vc.data());
std::cout << sCat2 << "|---" << '\n';
std::cout << sCat2.size() << "|---" << '\n';
std::cout << "------------" << '\n';
std::string sCat3(&vc[0]);
std::cout << sCat3 << "|---" << '\n';
std::cout << sCat3.size() << "|---" << '\n';
std::cout << "------------" << '\n';
输出:
love|---
7|---
------------
love|---
4|---
------------
love|---
4|---
------------
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))
执行相同操作的代码,但是新对象是一个std::string
。 - tobi_s