const char []的reverse_iterator行为

时间:2016-11-11 10:33:27

标签: c++ iterator

拥有以下对象:

const char      a[]{"abcdefghij"}; // Array of characters (length 11)
const std::string s{"abcdefghij"}; // Standard basic_string<char>

我希望以下循环的行为相同:

// #1 Outputs NOTHING, expected "jihgfedcba"
for (auto begin = std::rbegin(a), end = std::rend(a); begin != end; ++begin)
    std::cout << *begin;
std::cout << std::endl;
// #2 Outputs "jihgfedcba", as expected
for (auto begin = std::rbegin(s), end = std::rend(s); begin != end; ++begin)
    std::cout << *begin;
std::cout << std::endl;

但是打印字符数组不会输出任何内容,而打印字符串会显示预期的输出。

打印字符数组也会影响字符串的打印:如果在#2之前写入#1循环,程序只会输出顺序,而是显示单个jihgfedcba

我注意到调整std::rbegin(a)的返回值可以解决问题:

// Outputs "jihgfedcba", as expected
// notice the ++!!
for (auto begin = ++std::rbegin(a), end = std::rend(a); begin != end; ++begin)
    std::cout << *begin;
std::cout << std::endl;

// Outputs "jihgfedcba", as expected
for (auto begin = std::rbegin(s), end = std::rend(s); begin != end; ++begin)
    std::cout << *begin;
std::cout << std::endl;

为什么会这样?

1 个答案:

答案 0 :(得分:1)

char数组包含:

{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', '\0'} // 11 characters

虽然std::string包含:

"abcdefghij" // 10 characters

在第一种情况下,最后一个字符(循环中的第一个字符)是'\ 0'。当你“调整”循环时,你会跳过这个角色。

即使我无法重现您的行为,我也希望这是问题的根源。