C++ find_if 导致绑定函数崩溃

时间:2021-08-02 00:28:18

标签: c++ algorithm vector c++17 bind

情况有点复杂,但我会尽量解释清楚。
我正在尝试从对象指针向量中获取指向对象的指针,其中对象的属性之一与变量字符串匹配。为此,我将字符串变量绑定到一个函数,然后使用绑定函数尝试找到该对象指针。但是,每当我尝试此操作时,它都会崩溃。我已经尝试了很多不同的测试来找到问题所在,但我仍然一无所知。相关代码如下:

class A {
std::string n;
...
public:
const std::string getN() {
return n
}
};
static bool checkN(std::string n1, A* a) {
        if (a->getN() == n1) {
            return true;
        }
        else {
            return false;
        }
    }
void function() {
using namespace std::placeholders;
A* a;
std::string compare = "Yes";
const std::vector<A*> As; //As[0].n = "Yes";
auto check = std::bind(checkN, compare, _1);
a = (*std::find_if(As.begin(), As.end() - 1, check));  //This is the line where it crashes.
}

请注意,这是一个简化版本,但我认为它可以理解。有什么建议么? 编辑:在尝试简化代码时犯了一些语法错误。修复了它们。

1 个答案:

答案 0 :(得分:4)

As 是一个 const std::vector<A*>,其中包含 no 元素,因此在这种情况下取​​消引用 std::find_if(...) 返回的迭代器是未定义行为< /em>.

既然你没有提到你为什么在 As.end() - 1 中做 std::find_if(...),我假设你这样做是为了摆脱分段错误,但我恐怕赢了也没有摆脱上面的问题。

现在,要防止这种未定义行为发生,您要做的是检查std::find_if(...)返回的迭代器是否是不超过容器的最后一个元素(即检查是否std::find_if(...) != As.end(),然后才应该尝试取消引用std::find_if(...)返回的迭代器。 >

#include <functional>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <iomanip>
#include <vector>
#include <string>

// ...

int main() {
    using namespace std::placeholders;

    std::string compare = "Yes";

    const std::vector<A*> As;

    // Store the iterator returned by 'std::find_if(...)' inside a variable
    auto it = std::find_if(As.begin(), As.end(), std::bind(checkN, compare, _1));

    // Check whether the iterator is NOT past the last element i.e. check if it is not equals 'As.end()'
    if (it != As.end())
        std::cout << std::quoted(compare) << " found at index " << std::distance(As.begin(), it) << "!" << std::endl;
    // Otherwise, if the iterator is, in fact, equals 'As.end()', then it is safe to assume that the element was not found
    else
        std::cout << std::quoted(compare) << " was not found." << std::endl;
}