C++ 14 - std :: revers(ed)std :: string在开始时是否包含空字符?

10 c++ c++14

如果我std::reverse在std::string变量上使用,我可以安全地假设空字符'\0'将放在字符串的开头吗?

Die*_*Epp 15

不,它不包含NUL字节(除非你把它放在那里).前向迭代器也不包含NUL字节,它只会遍历字符串本身的字符.

但是,保证NUL字节超过.c_str()或结束.data().

示例程序:

#include <string>
#include <iostream>
#include <algorithm>

int main() {
    std::string s = "Hello";
    std::cout << "Forwards:\n";
    for (auto i = std::begin(s), e = std::end(s); i != e; ++i) {
        std::cout << *i << ' ' << static_cast<int>(*i) << '\n';
    }
    std::cout << "Backwards:\n";
    std::reverse(std::begin(s), std::end(s));
    for (auto i = std::begin(s), e = std::end(s); i != e; ++i) {
        std::cout << *i << ' ' << static_cast<int>(*i) << '\n';
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Forwards:
H 72
e 101
l 108
l 108
o 111
Backwards:
o 111
l 108
l 108
e 101
H 72

  • @zstewart实际上它最后会有自己的空字节 - 这就是为什么`c_str()`是O(1). (2认同)
  • 所以无论如何,为什么你得到了很多不同的答案是因为对于C++ 11,`std :: string`的规则发生了变化.在C++ 11之前,你不能保证C-ish收盘为零.从C++ 11开始,实际上`c_str()`和`data()`是相同的. (2认同)