C ++ VS17提供的输出与Linux子系统中的相同代码不同

时间:2018-11-18 01:15:45

标签: c++ linux visual-studio g++ mingw

我很难找到答案。我希望它不是重复的。我为leetcode.com挑战编写了代码,该挑战可按预期在VS17中使用,但不适用于leetcode或使用g ++编译的Ubuntu WSL。该代码搜索具有唯一字母的最长子字符串。字符串“ pwwkew”的答案为3(VS17为3),但是在Linux和leetcode上的答案是4。我猜它与MinGW vs G ++有关。在Ubuntu上,我使用以下几种不同版本的C ++编译了该程序:g++ -Wall -Wextra -Werror string.cpp -std=c++1y -o string

提前谢谢!这也是我的第一篇文章,所以对我容易:)。

#include <algorithm>
#include <vector>
#include <iostream>
#include <string>
#include <set>
#include <unordered_set>
using namespace std;


/*
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
*/

int main()
{
    string s = "pwwkew";

    //this algorithm adds unique chars to a set in the order that they appear in the string
    //after each for loop, the maximum number between maxLen and the size of the set is recorded
    //when a duplicate letter is found, all of the letters up until and including the last
    //occurence of that letter are erased, so the remaining letters are only the uniques in the current 'substring'
    unordered_set<char> seen;
    int maxLen = 0;
    for (int end = 0; end < s.size(); end++)
    {       
        if (seen.insert(s[end]).second == false)
        {
            if (seen.begin() == seen.find(s[end]))
            {
                seen.erase(seen.begin());
            }
            else {
                seen.erase(seen.begin(), seen.find(s[end+1]));
            }
            seen.insert(s[end]);
        }
        maxLen = max(maxLen, (int)seen.size());
    }


    return 0;
}    

编辑:我添加了一个迭代器循环,以在每次执行循环的初始值之后打印集合中的值,并且VS17打印:

p
p w
w
w k
w k e
k e w

Linux打印时:

p
w p
w p
k p w
e k p w
w

所以我猜测一个编译器会颠倒插入顺序,这会导致我的set.erase以错误的顺序执行?

2 个答案:

答案 0 :(得分:1)

您似乎正在假设unordered_set中值的顺序。请记住,顺序可能取决于实现方式,并且不同的实现方式可能会有不同的行为。

答案 1 :(得分:0)

unordered_set以不确定的顺序存储其元素。尝试删除使用seen.erase添加到集合中的前2个元素和两个迭代器。

重新考虑您在做什么,然后选择其他容器。