标准模板库(STL)是通用容器,迭代器,算法和函数对象的C ++库。当C ++被标准化时,STL的大部分被采用到标准库中,并且标准库中的这些部分有时也被错误地统称为“STL”。
C++:STL multimap.equal_range()
我得到了这段代码,但我无法理解 equal_range 方法返回迭代器的部分。 我知道 range 是里面有两个 multimap 对象的对对象,但我不明白的是为什么有 'for...
所以我有两个排序向量,我想将它们合并为一个排序向量而不使用额外的向量。 由于存在这种情况,我无法使用 std::merge,所以我尝试了 std::inplace_...
我的代码正在尝试使用映射查找总和为目标值的 int 对。但是,它仅适用于某些测试用例,不适用于其他测试用例。 输入的组织方式如下:
为什么我使用地图的代码不适用于多个测试用例,但适用于第一个测试用例?
我的代码正在尝试使用映射找出总和为目标的元素对。但是,它仅适用于第一个测试用例。即使它接受多个测试用例作为输入。 ...
我一直在尝试为一个简单的类实现一个自定义的前向迭代器。这个类是固定数组的一个非常糟糕的抽象(不幸的是我无法更改它)。可以访问元素...
std::string length() 和 size() 成员函数
我正在阅读这个问题的答案,发现实际上有一个名为 length() 的方法用于 std::string (我总是使用 size() )。在...中使用此方法有什么具体原因吗?
我试图了解比较器在 cpp 中是如何工作的。因此,当我插入 s1 时,不会调用比较器运算符,这是有道理的。但是当插入 s2 时,比较器运算符被校准...
这在 std::tuple; 中是如何工作的?元素“有”成员?
我最近在网上看到这个例子: typedef std::tuple< CInput, CAnimation, CTransform > ComponentTuple; 类实体 { ... ComponentTuple m_components; 民众: ...
当我短暂休息时,我的工作场所改用静态代码分析器。 他们对我正在从事的项目进行了运行,分析仪标记的一个特定问题如下所示(
std::ofstream ofs; 的 << "Hello, world!" << endl; Now I want to modify the contents of ofs to "Hello, money!" before writting to disk. How can I implement it?
在C++中,我相信,处理重新分配的更好方法是使用STL向量,因为它保证了连续的存储位置。 我有几个问题来理解其中的区别: 难道是……
如果我有这样的结构 std::map myMap; myMap["香蕉"] = 1; myMap["苹果"] = 1; myMap["橙色"] = 1; 我如何访问 myMap[0]? 我知道...
原子地 std::vector::push_back() 并返回索引
我需要创建一个函数,将一个值附加到向量并返回刚刚附加的值的索引。 例子: int 追加(std::vector& 数字,int 数字){ 整数
find() 方法如何在 std::set<std::pair<int,int>> 中工作?
我正在解决 LeetCode 问题“路径交叉”,其中我使用了一个集合>,试图找出点 x,y 是否已经在路径中。但我没有得到想要的结果。
使用 constexpr if 定义并声明 const std::array
我正在尝试实现高斯-勒让德求积,我想要一个模板化函数 将点数作为模板参数。 现在我有这个: 模板 我正在尝试实现高斯-勒让德求积,并且我想要一个模板化函数 将点数作为模板参数。 现在我有这个: template<int number_of_quadrature_points> double gaussian_quadrature_integral_core(double (*f)(double), double from, double to){ double scaling_factor = (to-from)/2; double average_factor = (from+to)/2; std::array<double, number_of_quadrature_points> factors; std::array<double, number_of_quadrature_points> points; if constexpr(number_of_quadrature_points == 2){ factors = {1, 1}; points = {-1.0/sqrt(3), 1.0/sqrt(3)}; } if constexpr(number_of_quadrature_points == 3){ factors = {5.0/9.0, 8.0/9.0, 5.0/9.0}; points = {-sqrt(3.0/5.0), 0, sqrt(3.0/5.0)}; } double sum = 0; for(int i = 0; i < number_of_quadrature_points; i++){ sum += factors.at(i)*((*f)(scaling_factor*points.at(i)+average_factor)); } sum *= scaling_factor; return sum; } 如您所见,当模板参数发生变化时,不仅数组大小发生变化,而且内容也发生变化,但对于给定的大小,内容是众所周知的。出于这个原因,我认为如果 std::arrays 是 const static 会更好,因为该函数被调用很多次。 现在我只能使用 if constexpr 来声明数组,但是如何使用它来定义和声明数组,以便它在 if constexpr 范围之外可见并且数组只定义一次? 添加两个辅助函数就足够了(如果您使用的是 C++20): template<unsigned N> constexpr auto init_factors() { std::array<double, N> rv; if constexpr(N == 2){ rv = {1., 1.}; } else { rv = {5.0/9.0, 8.0/9.0, 5.0/9.0}; } return rv; } template<unsigned N> constexpr auto init_points() { std::array<double, N> rv; if constexpr(N == 2){ rv = {-1.0/std::sqrt(3.), 1.0/std::sqrt(3.)}; } else { rv = {-std::sqrt(3.0/5.0), 0, std::sqrt(3.0/5.0)}; } return rv; } template<unsigned number_of_quadrature_points> double gaussian_quadrature_integral_core(double (*f)(double), double from, double to) { static constexpr auto factors = init_factors<number_of_quadrature_points>(); static constexpr auto points = init_points<number_of_quadrature_points>(); [...] 为了防止使用错误的点数,您可以添加 static_assert template<unsigned number_of_quadrature_points> double gaussian_quadrature_integral_core(double (*f)(double), double from, double to) { static_assert(number_of_quadrature_points==2||number_of_quadrature_points==3); ...或者如果您想稍后进行专业化,请阻止使用 SFINAE 进行匹配: #include <type_traits> template<unsigned number_of_quadrature_points> std::enable_if_t<number_of_quadrature_points==2||number_of_quadrature_points==3, double> gaussian_quadrature_integral_core(double (*f)(double), double from, double to) { 您可能有模板变量: template <std::size_t N> static constexpr std::array<double, N> factors; template <std::size_t N> static constexpr std::array<double, N> points; template <> constexpr std::array<double, 2> factors<2>{{1, 1}}; template <> constexpr std::array<double, 2> points<2>{{-1.0 / sqrt(3), 1.0 / sqrt(3)}}; template <> constexpr std::array<double, 3> factors<3>{{5.0 / 9.0, 8.0 / 9.0, 5.0 / 9.0}}; template <> constexpr std::array<double, 3> points<3>{{-sqrt(3.0 / 5.0), 0, sqrt(3.0 / 5.0)}}; 然后 template<int number_of_quadrature_points> double gaussian_quadrature_integral_core(double (*f)(double), double from, double to) { const double scaling_factor = (to - from) / 2; const double average_factor = (from + to) / 2; double sum = 0; for(int i = 0; i < number_of_quadrature_points; i++){ sum += factors<number_of_quadrature_points>[i] * ((*f)(scaling_factor * points<number_of_quadrature_points>[i] + average_factor)); } sum *= scaling_factor; return sum; } 演示 请注意,如果您没有 constexpr constexpr(而 const 没有),则必须将 sqrt 替换为 std::。 您可以使用本主题中类似的内容: 有没有办法在 C++ 模板特化中对常量值参数设置条件? 因此,我们使用 std::enable_if 和 SFINAE 创建两个模板专业化。我们通过模板参数number_of_quadrature_points来区分它们。这样我们就有了全局参数,不必多次定义和实例化。此代码使用 c++17 编译。 我还建议使用现代方法 std::function<> 而不是函数指针。 #include <array> #include <cmath> #include <iostream> #include <functional> template<int number_of_quadrature_points, typename E=void> struct gaussian_quadrature_params { }; template<int number_of_quadrature_points> struct gaussian_quadrature_params<number_of_quadrature_points, std::enable_if_t<(number_of_quadrature_points==2)> > { constexpr static const std::array<double, number_of_quadrature_points> factors = {1, 1}; constexpr static const std::array<double, number_of_quadrature_points> points = {-1.0/sqrt(3), 1.0/sqrt(3)}; }; template<int number_of_quadrature_points> struct gaussian_quadrature_params<number_of_quadrature_points, std::enable_if_t<(number_of_quadrature_points==3)> > { constexpr static const std::array<double, number_of_quadrature_points> factors = {5.0/9.0, 8.0/9.0, 5.0/9.0}; constexpr static const std::array<double, number_of_quadrature_points> points = {-sqrt(3.0/5.0), 0, sqrt(3.0/5.0)}; }; double f(double x) { return x; } template<int number_of_quadrature_points> double gaussian_quadrature_integral_core(std::function<double(double)> f, double from, double to){ double scaling_factor = (to-from)/2; double average_factor = (from+to)/2; double sum = 0; for(int i = 0; i < number_of_quadrature_points; i++){ sum += gaussian_quadrature_params<number_of_quadrature_points>::factors.at(i)*(f(scaling_factor*gaussian_quadrature_params<number_of_quadrature_points>::points.at(i)+average_factor)); } sum *= scaling_factor; return sum; } int main() { std::cout << gaussian_quadrature_integral_core<2>(f, -1.0, 1.0) << std::endl; std::cout << gaussian_quadrature_integral_core<3>(f, -1.0, 1.0) << std::endl; } 怎么样 // N: number_of_quadrature_points template<int N> double gaussian_quadrature_integral_core(double (*f)(double), double from, double to) { constexpr std::array<double, N> factors = []() ->std::array<double, N>{ if constexpr(N == 2) return {1.0, 1.0}; else if constexpr(N == 3) return {5.0 / 9.0, 8.0 / 9.0, 5.0 / 9.0}; // ... other N cases }(); constexpr std::array<double, N> points= []()->auto{ if constexpr(N == 2) return std::array<double, N>{-1.0 / std::sqrt(3), 1.0 / std::sqrt(3)}; else if constexpr(N == 3) return std::array<double, N>{-std::sqrt(3.0 / 5.0), 0, std::sqrt(3.0 / 5.0)}; // ... other N cases }(); double scaling_factor = (to - from) / 2; double average_factor = (from + to) / 2; double sum = 0; for (int i = 0; i < N; i++) sum += factors.at(i)*((*f)(scaling_factor * points.at(i) + average_factor)); sum *= scaling_factor; return sum; } 使用 if constexpr 声明和定义数组。
Visual Studio 2022(最新版本,17.7.7)IntelliSense 崩溃并显示以下代码。 重现步骤 将代码复制/粘贴到 IDE 更改代码,例如取消注释 std::vector
将 std::vector intVec 转换为 std::vector doubleVec 的好干净方法是什么。或者,更一般地说,转换两个可转换类型的向量?