天道酬勤,学无止境

c++

如何在 C++ 中获取文件名与目录名(使用 boost 文件系统库)(how to get file names vs directory names in c++ (using boost filesystem library))

问题 当我使用boost::filesystem获取目录中的文件名列表时,我会收到文件名和目录名: #include <string> #include <iostream> #include <boost/filesystem.hpp> using namespace std; using namespace boost::filesystem; int main() { path p("D:/AnyFolder"); for (auto i = directory_iterator(p); i != directory_iterator(); i++) { cout << i->path().filename().string() << endl; } } 输出是这样的: file1.txt file2.dat Folder1 //which is a folder 有没有快速区分文件和文件夹的方法? 如果重要的话,我的操作系统是 Windows 8.1。 回答1 is_directory() boost::filesystem::is_directory(i->path()); 回答2 最终代码: #include <string> #include <iostream> #include <boost/filesystem.hpp> using namespace std

2021-09-21 19:10:21    分类:技术分享    c++   c++11   boost   boost-filesystem

静态初始化(static initialization)

问题 上下文 我正在做一个有一些“模块”的项目。 我在这里所说的模块是一个简单的类,它实现了一个特定的功能并派生自一个强制接口的抽象类 GenericModule。 将来应该添加新模块。 一个模块的多个实例可以同时加载,也可以不加载,具体取决于配置文件。 我认为,如果未来的开发人员能够以简单的方式在系统中“注册”他的模块,那就太好了。 或多或少与他们在谷歌测试中注册测试的方式相同。 上下文²(技术) 我正在用visual studio 2005 构建项目。代码完全在一个库中,除了在exec 项目中的main()。 我想保持这种状态。 我的解决方案 我从他们对谷歌测试所做的事情中找到了灵感。 我创建了一个模板化工厂。 看起来或多或少是这样的(我跳过了无趣的部分以保持这个问题的可读性): class CModuleFactory : boost::noncopyable { public: virtual ~CModuleFactory() {}; virtual CModuleGenerique* operator()( const boost::property_tree::ptree& rParametres ) const = 0; }; template <class T> class CModuleFactoryImpl : public CModuleFactory {

2021-09-21 19:09:43    分类:技术分享    c++

C++ 分配器 ::解除分配(NULL,1) 允许吗?(C++ allocator<X>::deallocate(NULL,1) allowed?)

问题 允许free(NULL)和::operator delete(NULL) 。 分配器概念(例如 std::allocator 也允许deallocate(NULL,1) ,还是需要自己保护它? 回答1 您需要添加自己的支票。 根据 §20.4. 1.1/8, deallocate需要: p 应该是从allocate() 获得的指针值。 n 应等于作为第一个参数传递给调用分配的值,该调用返回 p。 当无法提供存储空间时, allocate会抛出异常(第 20.4. 1.1/7 节)。 换句话说, allocate永远不会返回 0,因此deallocate永远不会得到 0。传递 0 会导致未定义的行为。

2021-09-21 19:08:07    分类:技术分享    c++   memory-management   null   free   allocator

如何获得特征库中矩阵的秩?(How to get rank of a matrix in Eigen library?)

问题 如何在特征中获得矩阵的秩? 回答1 您需要将矩阵转换为显示等级的分解。 例如FullPivLU 。 如果你有一个matrix3f它看起来像这样: FullPivLU<Matrix3f> lu_decomp(your_matrix); auto rank = lu_decomp.rank(); 编辑 分解矩阵是获得秩的最常用方法。 虽然,如维基百科上的排名文章所述,LU 并不是实现浮点值的最可靠方法 当应用于计算机上的浮点计算时,基本的高斯消元(LU 分解)可能不可靠,而应改用秩揭示分解。 一种有效的替代方法是奇异值分解 (SVD),但还有其他成本较低的选择,例如带枢轴的 QR 分解(所谓的秩揭示 QR 分解),它们在数值上仍比高斯消元法更稳健。 秩的数值确定需要一个标准来决定某个值(例如来自 SVD 的奇异值)何时应被视为零,这是一个取决于矩阵和应用的实际选择。 因此,您可能会使用Eigen::ColPivHouseholderQR< MatrixType >获得更准确的结果 回答2 使用 QR 或 SVD 分解并检查结果矩阵也应该有效。 SVD 可能更可靠。

2021-09-21 19:03:46    分类:技术分享    c++   matrix   eigen   rank   eigen3

在一个函数容器中存储和调用不同参数的函数(Storing and calling functions of different arguments in one function container)

问题 这是我想要实现的示例设计代码。 基本上我想为不同的 handlerNames 存储处理程序函数,这些处理程序函数可以是可变参数。 处理程序函数应在事件上调用,并通过 Script::Handle(...) 传递所需的参数 我怎样才能做到这一点? 也许它可能与可变模板? class Script { public: Script() { /* ... */ } template<typename TFunction> void AddHandler(const char *handlerName, TFunction &&function) { _handlerMap[handlerName] = std::move(function); } void Handle(const char *handlerName, ...) { _handlerMap[handlerName](...); } private: typedef std::map<std::string, std::function<void()>> HandlerMapType; HandlerMapType _handlerMap; }; //Handler functions handlerOne() { std::cerr << "One"; } handlerTwo(std::string a1

2021-09-21 19:00:38    分类:技术分享    c++

如何避免使用大向量初始化的“编译器限制:编译器堆栈溢出”?(How to avoid “compiler limit: compiler stack overflow” with large vector inits?)

问题 在我的单元测试中,我收到以下编译器错误: The error message indicates as follows: 'fatal error C1063: compiler limit: compiler stack overflow' 这是由一些生成的标头引起的,其中包含: std::vector<unsigned char> GetTestData() { return { 0x1, 0x2, 0x3 }; // Very large 500kb of data } 如何在不使 MSVC 崩溃的情况下以这种方式使用向量? 请注意,代码在 clang 和 gcc 中构建正常。 回答1 尝试将您的数据放入 const 静态数组,然后使用向量的范围 ctor: std::vector<unsigned char> GetTestData() { static const unsigned char data[] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x0, ... }; // Very large 500kb of data return std::vector<unsigned char>(data, data + sizeof(data)); } 编辑:感谢 Lundin 指出 const。 回答2

2021-09-21 18:39:51    分类:技术分享    c++   visual-c++

游戏开发:如何限制 FPS?(Game Development: How to limit FPS?)

问题 我正在写一个游戏,我看到 FPS 算法不能正常工作(当他必须计算更多时,他睡得更久......)所以,问题很简单:如何计算睡眠时间以获得正确的 FPS ? 我知道以微秒为单位更新一帧游戏需要多长时间,当然还有我想要达到的 FPS。 我正在疯狂地寻找一个简单的例子,但我找不到一个...... 代码可能是 Java、C++ 或伪代码...... 回答1 每帧的微秒数为1000000 / frames_per_second 。 如果你知道你已经花费了elapsed_microseconds计算,那么你需要睡觉的时间是: (1000000 / frames_per_second) - elapsed_microseconds 回答2 你应该花在渲染一帧上的时间是1/FPS秒(如果你的目标是 10 FPS,你应该在每一帧上花 1/10 = 0.1 秒)。 因此,如果渲染需要X秒,您应该“睡眠” 1/FPS - X秒。 将其转换为例如毫秒,您会得到 ms_to_sleep = 1000 / FPS - elapsed_ms; 如果它,出于某种原因需要超过1/FPS来渲染帧,您将获得负的睡眠时间,在这种情况下,您显然只是跳过睡眠。 回答3 尝试... static const int NUM_FPS_SAMPLES = 64; float fpsSamples[NUM_FPS

2021-09-21 18:39:45    分类:技术分享    java   c++   algorithm   frame-rate

将 HarddiskVolume 路径转换为普通路径 [重复](Convert HarddiskVolume path to normal path [duplicate])

问题 这个问题在这里已经有了答案: 硬盘卷路径到完整文件路径1 个回答 5年前关闭。 我有这样的设备路径 设备\HarddiskVolume2\Windows\ 我想把它转换成这样的正常路径 C:\Windows 我尝试使用 (_fullpath-_splitpath-etc...) 但没有新结果。 哪个功能完成这项工作? 回答1 一种选择是用\\?\替换Device\ ,如下所示: \\?\HarddiskVolume2\Windows\ 然后,您可以使用带有FILE_FLAG_BACKUP标志的CreateFile()打开目录的句柄,然后调用 GetFinalPathNameByHandle() 来查找 DOS 路径。 #include <Windows.h> #include <stdio.h> int main(int argc, char ** argv) { wchar_t lpszFilePath[MAX_PATH + 1]; DWORD dw; HANDLE hFile = CreateFileW(L"\\\\?\\HarddiskVolume2\\Windows\\", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE

2021-09-21 18:19:57    分类:技术分享    c++   windows   path

与 VS2010/Cuda4.2 相比,VS2013/Cuda7.0 中的 CUFFT 慢 1000 倍(CUFFT is 1000x slower in VS2013/Cuda7.0 compared to VS2010/Cuda4.2)

问题 这个简单的 CUFFT 代码在两个 IDE 上运行 - VS 2013 与 Cuda 7.0 VS 2010 与 Cuda 4.2 我发现使用 Cuda 7.0 的 VS 2013 大约慢了1000倍。 代码在 VS 2010 中的执行时间为0.6 ms ,在 VS 2013 中平均为520 ms 。 #include "stdafx.h" #include "cuda.h" #include "cuda_runtime_api.h" #include "cufft.h" typedef cuComplex Complex; #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cudaEvent_t start, stop; cudaEventCreate(&start); cudaEventCreate(&stop); cudaEventRecord(start); const int SIZE = 10000; Complex *h_col = (Complex*)malloc(SIZE*sizeof(Complex)); for (int i = 0; i < SIZE; i++) { h_col[i].x = i; h_col[i].y = i; }

2021-09-21 18:11:39    分类:技术分享    c++   visual-studio-2010   visual-studio-2013   cuda   cufft

Valgrind 非法指令 AVX(Valgrind illegal instruction AVX)

问题 使用 valgrind 评估我的程序时收到一些错误。 更准确地说,我收到了类似的错误 vex amd64->IR:未处理的指令字节:0xC5 0xF8 0x28 0x0 0xC5 0xF8 0x29 0x45 ... ...非法指令 我将问题隔离为一个非常简单的示例 #include <immintrin.h> int main() { float f __attribute__((aligned(16))); // No need to be aligned f = 2.0f; __m128 a = _mm_broadcast_ss(&f); return 0; } 该程序使用带有选项 -mavx 的 gcc 编译。 如果使用 SSE2 指令 _mm_set1_ps,则会发生相同的错误,但仅在使用 -mavx 编译时才会发生。 使用 -msse2 编译程序时,valgrind 不会报告任何错误。 我怀疑这是一个 valgrind 错误,但找不到关于 x86 的任何报告。 我的机器是 Core-i7 Sandy-Bridge 和 valgrind 3.7.0 版。 如果有人有更好的 valgrind 替代方案来进行寄存器感知编程,我想知道。 提前致谢 回答1 您使用的是 2011 年 11 月发布的非常旧的 valgrind 3.7.0。它不支持 AVX/AVX2。 3.8

2021-09-21 18:08:08    分类:技术分享    c++   c   valgrind