在最近的几次会议演示中,我听说Bjarne Stroustrup和其他人提到了C++的新编码指南以及支持它们的一些类型.
具体来说,我记得一个例子,span<T>而不是(T* p, int n)作为一个函数的参数(在约32:00进入谈话时); 但我也记得使用的建议array_view<T>.它们是两个替代方案但是相同的概念吗?或者我是否混淆了事情,他们实际上并没有那么相关?
我似乎无法找到任何关于它们应该是什么的权威定义.
c++ array-view cpp-core-guidelines guideline-support-library
我有一个template<typename T>功能,需要一个const vector<T>&.在说的功能,我有载体cbegin(),cend(),size(),和operator[].据我了解,双方string并vector用连续的空间,所以我在想,如果我能在一个优雅的方式重新使用两种数据类型的功能.
可以std::string重新解释为std::vector(适当的)char_type吗?如果是这样,限制是什么?
我正在编写一些代码来集成ODE.这个问题同样是对解决方案的编码建议的要求,所以如果您对我即将提供的建议有其他建议,请告诉我!
由ODE集成商集成的"对象"以6个"块"为单位......原因是我有一个std :: vector of double,它们按以下方式排列:
前3个双打是位置坐标; x,y和z.接下来的3个双打是速度坐标; x,y和z.
那么,现在你知道了,我有一个函数,它将成对的"位置" """向量"""作为参数并返回某种结果......看看我要去哪里?
目前,该函数需要以下列方式使用2个位置坐标:
std::vector<double> magic_gravity_formula(const std::vector<double> &r1,
const std::vector<double> &r2, const double m1, const double m2)
Run Code Online (Sandbox Code Playgroud)
我不想将3组中的所有数据复制到新的向量 - 这是一种疯狂(并且非常慢)的编程方式.
我可以使用指向原始数据的指针......并且只是将指针传递给x坐标(3个双打块中的第一个项目) - 这对我来说似乎没有问题,但也许有更好的方法?有点像Python或Matlab数组切片?我可以这样做吗?
我想传递一个新的向量(或某种包装类?),从已存储在数组中的数据创建...有点像
std::vector<double> sub_section_of_data = data[0..2] // Obviously pseudocode!
Run Code Online (Sandbox Code Playgroud)
好的,所以上面的内容是荒谬的,因为大概是一种实现该语法的语言仍然可以进行复制操作,这可能很慢 - 正是我想要避免的...
所以,是的,我不确定这里最好的方式 - 有人能建议一个"好"的解决方案吗?(以非主观的方式!)
编辑:为了使这一点非常清楚 - 问题是我不想做类似的事情:
std::vector<double> r1_temp;
r1_temp.push_back(data[0]); // Copy ! Bad !
r1_temp.push_back(data[1]);
r1_temp.push_back(data[2]);
... same for an r2 ...
std::vector<double> force = magic_gravity_formula(r1, r2, m1, m2);
Run Code Online (Sandbox Code Playgroud)
编辑2:考虑编译器选项 - 编译器是否会通过以下方式更改函数以接受参数来为我优化我的代码:
std::vector<double> super_gravity_formula(double x1, …Run Code Online (Sandbox Code Playgroud) 假设我有一些类层次结构,其中有几个virtual函数返回容器引用:
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
class Interface {
public:
virtual const std::vector<int>& getArray() const = 0;
virtual const std::set<int>& getSet() const = 0;
virtual const std::map<int, int>& getMap() const = 0;
};
class SubclassA : public Interface {
public:
const std::vector<int>& getArray() const override { return _vector; }
const std::set<int>& getSet() const override { return _set; }
const std::map<int, int>& getMap() const override { return _map; }
private:
std::vector<int> _vector;
std::set<int> _set; …Run Code Online (Sandbox Code Playgroud) 我有一个算法,我想翻译我的代码,而不是使用数组,我想使用矢量.
你会如何翻译这个:( b + j和a的一面)
find_kth(a, b + j, i, size_b - j, k - j);
Run Code Online (Sandbox Code Playgroud)
哪里
int find_kth(int a[], int b[], int size_a, int size_b, int k);
Run Code Online (Sandbox Code Playgroud)
成
int find_kth(const vector<int>& a, const vector<int>& b, int size_a, int size_b, int k);
Run Code Online (Sandbox Code Playgroud)
它必须是等效的,所以像这样的调用返回相同的值,就像我使用数组一样:
min(a[0], b[0]);
Run Code Online (Sandbox Code Playgroud)