我正在尝试对包含从std::sort
读取的信息的数据类型使用boost::filesystem::dictionary_iterator
。看来,由于排序算法已完成n
比较,n
是目录中的文件数,该信息会丢失,我最终会发生segfaulting。 Valgrind说我正在使用未初始化的值并进行无效读取。
如何更改File
数据类型或算法,以便在传递之间保留信息?
#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;
}
(这不是我的实际程序,但表现出相同的行为。)
答案 0 :(得分:2)
最后对compare()的调用是错误的,它返回一个可以是-1,0或1的int,就像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()取消激活),编译器应该能够将其优化为与之前相同的代码量。现在,我希望您能够编写按顺序对文件名9.png,10.png和11.png进行排序的代码。 ;)