lower_bound在函数中很奇怪,通常在main()中

时间:2018-03-03 14:41:28

标签: c++ lower-bound

我有这段代码:

        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()才会这样做。

2 个答案:

答案 0 :(得分:3)

函数中的字符串文字中包含隐藏字符,因此0 * * * * bash -l -c 'sh /my/script.sh' 中存在 no 匹配。

因为在解除引用之前你永远不会检查lower_bound的结果不是lower_bound,所以你有不确定的行为。

无论如何,该函数应该使用range_end

答案 1 :(得分:1)

上面的源代码中的字符串文字中有一些不可打印或宽字符。有趣的家伙。

(然后你试图在end()取消引用一个迭代器,其行为是未定义的。)