c++ 打印出一个只有一个元素的集合什么也没有显示

wf82jlnq  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(101)

当我试图弄清楚为什么我为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() << "";
}

字符串
下面的代码表明**的大小为1,但同时,当我尝试打印出项目时,它什么也不显示。
这怎么可能?
我在网上查了一个集合的最小大小,发现它是0,所以这个问题也与此无关。
预期行为应为mems.size() == 2

bvuwiixz

bvuwiixz1#

你的for循环从0,1,2(包括2)开始迭代,这可能不是你的本意。将<= check替换为strict <以避免这种情况。另一方面,这里发生的是,你在位置2访问大小为2的s字符串,根据标准,它返回空字符(0或'\0')。
Do std::strings end in '\0' when initialized with a string literal?
所以在结尾处,null包含一个0字符,当你打印它时,它不会做任何事情,就像打印一个空字符串一样。在索引2处返回null字符串的原因可能与c字符串有关,c字符串总是以null结尾,以便更容易打印它们。例如:

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

字符串
这将打印“foo”,但printf并不真正知道str的大小,str只是一个指针,但当它遇到0时,它会停止。
const char* str = "f\0oo";,然后只打印字母f

相关问题