打印出一个元素的集合不会显示任何内容

Printing out a set with one element shows nothing

提问人:tryst with freedom 提问时间:11/12/2023 最后编辑:Abderrahmene Rayene Mihoubtryst with freedom 更新时间:11/13/2023 访问量:23

问:

当我试图弄清楚为什么我为leet代码问题编写的解决方案不起作用时,问题就出现了。

#include <algorithm>
#include <iostream>
#include <set>

using namespace std;

int main() {

    string s = "au";     

    std::set < char > mems;
    int ans = 0;
    for (int i = 0; i <= s.length(); i++) {

        for (int j = i; j <= s.length(); j++) {
            if (mems.count(s[j]) == 1) {
                if (j - i > ans) { ans = j - i; }
                
                i = j - 1;
                j = s.length();

                mems.clear();
            }
            else {
                mems.insert(s[j]);
            }
        }
    }

    if (s.length() == mems.size()) { ans = s.length(); }

    for (auto item : mems)
        std::cout << item << endl;

    cout<<mems.size() << "";
}

以下代码表明 mems 的大小为 1,但与此同时,当我尝试打印出项目时,它什么也没显示。

这怎么可能?

我在网上检查了一组的最小大小,我发现它是 0,所以问题也与此无关。

预期行为应为 。mems.size() == 2

C++

评论


答:

1赞 balazon 11/12/2023 #1

你的 for 循环是从 0,1,2(包括 2 个)迭代的,这可能不是你故意的。将您的 <= check 替换为严格<以避免这种情况。 另一方面,这里发生的情况是,您正在访问位置 2 处大小为 2 的字符串,该字符串根据标准返回一个 null 字符(0 或“\0”)。

当使用字符串文字初始化时,std::strings 是否以“\0”结尾?

所以最后 mems 包含一个 0 字符,当你打印它时,它没有任何作用,就像打印一个空字符串一样。 此处在索引 2 处返回 null 字符串的原因可能与 c 字符串有关,c 字符串始终以 null 结尾,以便于打印它们。 例如:

const char* str = "foo";
printf("%s\n", str);

这打印了“foo”,但 printf 并不真正知道 str 的大小,它只是一个指针,但是当它遇到 0 时,它就停止了。 作为实验,您可以将 str 替换为

const char* str = "f\0oo";然后只打印字母 F