请不要对诸如我应该如何通过引用等方式发表评论。这段代码完全是实验性的。专注于非确定性行为。
我知道标题听起来很怀疑。
这是怎么回事:
vector<int> find_permutation2(vector<int> v) {
int k = (int)v.size() - 1;
while(k >= 0 && v[k] >= v[k + 1])
k--;
if(k == -1) return vector<int>();
int i;
for(i = (int)v.size() - 1; i > k; i--) {
if(v[i] > v[k])
break;
}
vector<int> r(v);
std::swap(r[k], r[i]);
std::reverse(r.begin() + k + 1, r.end());
return r;
}
int main() {
vector<int> foo = {2,3,4,1,0};
vector<int> bar = find_permutation2(foo);
default_random_engine g;
uniform_int_distribution<int> dist(5,10);
for(int i = 0; i < 10000; i++) {
int size = dist(g);
vector<int> p(size);
iota(p.begin(), p.end(), 0);
shuffle(p.begin(), p.end(), g);
//
// BREAKPOINT ON THE FOLLOWING LINE
// I continue until p == {2,3,4,1,0}
//
vector<int> r = find_permutation2(p);
vector<int> pc = vector<int>(p);
bool res = std::next_permutation(pc.begin(), pc.end());
if(res)
assert(pc == r);
else
assert(r.size() == 0);
}
现在,请检查我的LLDB输出是否存在某些查询(请注意产生的不同输出):
(lldb) expr find_permutation2(p)
(std::__1::vector<int, std::__1::allocator<int> >) $0 = size=5 {
[0] = 2
[1] = 4
[2] = 0
[3] = 1
[4] = 3
}
(lldb) expr find_permutation2(p)
(std::__1::vector<int, std::__1::allocator<int> >) $2 = size=5 {
[0] = 2
[1] = 3
[2] = 4
[3] = 1
[4] = 0
}
(lldb) expr find_permutation2(foo)
(std::__1::vector<int, std::__1::allocator<int> >) $0 = size=5 {
[0] = 2
[1] = 3
[2] = 4
[3] = 1
[4] = 0
}
(lldb) expr find_permutation2(foo)
(std::__1::vector<int, std::__1::allocator<int> >) $2 = size=5 {
[0] = 2
[1] = 4
[2] = 0
[3] = 1
[4] = 3
}
顺便说一句,不仅是LLDB。如果我运行代码,则断言有时会失败,而有时不会在给定的input上失败{2,3,4,1,0}
。上述两者之间的输出似乎完全是随机的。
编辑-明确的问题
有人可以告诉我为什么相同功能调用的相同输入得到不同的输出吗?
在这段代码中
int k = (int)v.size() - 1;
while(k >= 0 && v[k] >= v[k + 1])
v[k+1]
指的是v
第一次迭代结束后的元素,该元素给出未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句