Boost::filesystem, std::sort:在排序传递时难以保留信息
Boost::filesystem, std::sort: trouble retaining information on sort passes
我试图在包含从boost::filesystem::dictionary_iterator
读取的信息的数据类型上使用std::sort
。看起来,由于排序算法已经完成了n
比较,n
是目录中的文件数量,该信息丢失,并且我最终进行了分段故障。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;
}
(这不是我的实际程序,但表现出相同的行为)
在末尾调用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()),编译器应该能够将其优化为与以前相同的代码量。现在,我希望您在编写按顺序对9.png, 10.png和11.png文件名进行排序的代码时非常愉快。div;)
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 有根的二进制搜索树.保留与其父级的链接
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 为多个会话保留XPtr
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何设置一个范围来提取我想要获得的信息
- 保留对其他类的成员函数的引用
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- 指针保留字符串
- 为什么 gcovr 会生成空覆盖率统计信息?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 必须为 C++20 协程帧保留多少内存?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- MinGW 上的 g++ 在使用 SDL2 时无法保留行号信息
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- 无效*保留继承信息
- 如何在不同的上下文(例如线程)中保留原始异常类型信息
- Boost::filesystem, std::sort:在排序传递时难以保留信息
- 从 Iplimage 转换为 Mat 不会保留深度信息