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。只需向比较器添加一个断言。