gpt4 book ai didi

c++ - Boost::filesystem、std::sort:在排序过程中保留信息时遇到问题

转载 作者:行者123 更新时间:2023-11-30 04:19:40 25 4
gpt4 key购买 nike

我正在尝试对包含从 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() 是错误的,它像 strcmp() 一样返回一个可以是 -1、0 或 1 的 int。改用对 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 进行排序的代码时玩得开心。 ;)

关于c++ - Boost::filesystem、std::sort:在排序过程中保留信息时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15718581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com