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



我很难找到答案。我希望它不是复制品。我为leetcode.com的挑战编写了代码,该挑战按预期在VS17中运行,但在leetcode或我的用g++编译的Ubuntu WSL上却没有。该代码搜索具有唯一字母的最长子字符串。字符串"pwwkew"的答案是3(VS17得到3(,但在Linux和leetcode上是4。我猜这与MinGW与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以错误的顺序执行吗?

您似乎在假设unrdered_set中的值的顺序。请记住,顺序可能取决于实现,不同的实现可以有不同的行为。

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

重新思考你在做什么,选择一个不同的容器。

相关内容

  • 没有找到相关文章

最新更新