Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost::filesystem,std::sort:无法保留排序过程中的信息_C++_Sorting_Boost_Segmentation Fault_Boost Filesystem - Fatal编程技术网

C++ Boost::filesystem,std::sort:无法保留排序过程中的信息

C++ Boost::filesystem,std::sort:无法保留排序过程中的信息,c++,sorting,boost,segmentation-fault,boost-filesystem,C++,Sorting,Boost,Segmentation Fault,Boost Filesystem,我试图对包含从boost::filesystem::dictionary\u迭代器读取的信息的数据类型使用std::sort。由于排序算法进行了n比较,n是目录中的文件数,因此信息会丢失,最终导致错误。Valgrind说我正在使用未初始化的值并进行无效读取 如何更改我的文件数据类型或算法,以便在两次传递之间保留信息 #include <iostream> #include <algorithm> #include <vector> #include <s

我试图对包含从
boost::filesystem::dictionary\u迭代器
读取的信息的数据类型使用
std::sort
。由于排序算法进行了
n
比较,
n
是目录中的文件数,因此信息会丢失,最终导致错误。Valgrind说我正在使用未初始化的值并进行无效读取

如何更改我的
文件
数据类型或算法,以便在两次传递之间保留信息

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;

struct File {
    fs::path path;
    fs::file_status status;
};

bool comp(const File& a, const File& b) {
    static size_t count = 0;
    std::cout << "Compare function called " << ++count << " times" << std::endl;
    std::string a_filename = a.path.filename().native();
    std::string b_filename = b.path.filename().native();
    return a_filename.compare(b_filename);
}

int main() {
    std::vector<File> vec;

    // Read directory
    fs::directory_iterator it("/etc"), end;
    for (; it != end; it++) {
        File f = *(new File);
        f.path = it->path();
        f.status = it->status();
        vec.push_back(f);
    }

    std::sort(vec.begin(), vec.end(), comp);

    // Clean up
    for (std::vector<File>::iterator it = vec.begin(); it != vec.end(); it++)
        delete &(*it);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
名称空间fs=boost::filesystem;
结构文件{
fs::路径;
文件状态;
};
布尔公司(常量文件和a、常量文件和b){
静态大小\u t计数=0;
std::cout末尾对compare()的调用是错误的,它返回的int可以是-1、0或1,就像strcmp()一样。使用对std::less()的简单调用(a_filename,b_filename)。另外,还要确保进行单元测试,以确保比较器创建严格的弱顺序,这是std::sort所需的

带内部检查的比较器:

inline bool do_compare(const File& a, const File& b)
{
    /* ... */
} 

bool compare(const File& a, const File& b)
{
    bool const res = do_compare(a, b);
    if(res)
        assert(!do_compare(b, a));
    return res;
}

如果定义了NDEBUG(即assert()已停用)编译器应该能够像以前一样把代码优化到相同的代码。现在,我希望你能编写代码来排序文件名9pNG、10pNG和11pNG。)(

)哦,是的,这是可行的。我花了很长时间才想出来。谢谢。还有一个问题:很多C++实现都是用DIAG来实现的。nostic模式应该已经捕捉到这一点。或者,您可以向比较器添加一个。如果comp(a,b)返回true,则comp(b,a)必须返回false。只需向比较器添加一个断言。