我有这段代码:
int main() {
const vector<string> sorted_strings = { "zzzу", "zzzzу",
"zzzzzу", "zzzzzzzу" };
cout << *lower_bound(begin(sorted_strings),
end(sorted_strings), "zzzy");
}
我希望cout
能够打印"zzzу"
,因为lower_bound
应该打印的元素等于或大于val
参数。
然而,当我在main()
之外的函数中运行相同的代码行时,事情变得奇怪:
template <typename RandomIt>
pair<RandomIt, RandomIt> FindStartsWith(RandomIt range_begin,
RandomIt range_end, const string& prefix) {
// Empty range
if (range_begin == range_end)
return { range_begin, range_begin };
// When there is at least one word with the prefix
RandomIt it_begin = lower_bound(range_begin, range_end, "zzzу");
cout << (*it_begin) << endl;
return {{}, {}};
}
int main() {
const vector<string> sorted_strings = { "zzzу", "zzzzу",
"zzzzzу", "zzzzzzzу" };
cout << *lower_bound(begin(sorted_strings), end(sorted_strings), "zzzy") << endl;
const auto mo_result = FindStartsWith(begin(sorted_strings),
end(sorted_strings), "zzzу");
return 0;
}
我的期望:同时main()
和FindStartsWith()
打印zzzу
我得到的内容:只有main()
才会这样做。
答案 0 :(得分:3)
函数中的字符串文字中包含隐藏字符,因此0 * * * * bash -l -c 'sh /my/script.sh'
中存在 no 匹配。
因为在解除引用之前你永远不会检查lower_bound
的结果不是lower_bound
,所以你有不确定的行为。
无论如何,该函数应该使用range_end
。
答案 1 :(得分:1)
上面的源代码中的字符串文字中有一些不可打印或宽字符。有趣的家伙。
(然后你试图在end()
取消引用一个迭代器,其行为是未定义的。)