C++:集合有一个元素,但打印出集合没有显示任何内容?

问题描述 投票:0回答:1

当我试图找出为什么我为 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

set
1个回答
0
投票

您的 for 循环从 0,1,2(包括 2)开始迭代,您可能无意这样做。更换您的 <= check to strict < to avoid this. On the other hand, what happens here, is that you're accessing s string of size 2 at position 2, which returns a null character (0 or '\0') according to the standard.

用字符串初始化时 std::strings 是否以 ' ' 结尾?

所以最后 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

© www.soinside.com 2019 - 2024. All rights reserved.