我有
struct Vector {
float i,j,k;
}
Run Code Online (Sandbox Code Playgroud)
我想将以下声明的vec的所有元素归零(i,j,k = 0)
std::vector <Vector> vec;
vec.resize(num,0);
Run Code Online (Sandbox Code Playgroud)
我不想使用reserve()然后push_back()逐个零.另一件事是,在成功初始化vec之后,我想在操作之后将vec的所有成员再次设置为零.有没有类似memset的矢量?
编辑:
我比较了Mike Seymour和Xeo的答案中的所有方法,size_t size = vec.size();
vec.clear();
vec.resize(size);如果它们在循环中频繁重复,则结果
最快.
这个符号是什么意思-1.$e+000?这些东西包含在哪个类别中,或者我可以搜索哪些关键字?

编辑:提高精度后,这是我得到的:

我有一个奇怪的问题.有一个结构向量.使用临时结构,我push_back到结构向量.但是当我检查第一个成员时cnt,我发现它变了.任何的想法?(下面的代码是简化版,但代表性的一个)
struct Vector
{
float *dim;
Vector ()
{
dim = new float [3];
}
};
struct Face
{
float an_N, an_P;
int P, N;
Vector Af;
float Ad;
Vector cnt;
float ifac;
float mf;
};
std::vector <Face> face;
Face temp_face;
for (;;)
{
temp_face.cnt.dim[0] = 0.f;
temp_face.cnt.dim[1] = 0.f;
temp_face.cnt.dim[2] = 0.f;
for (int q=0; q<n_vtx_2D; ++q)
{
temp_face.cnt = temp_face.cnt + pt[vtx[q]] / n_vtx_2D;
}
face.push_back(temp_face);
}
std::cout << face[0].cnt.dim[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)
产量
0.25
0
如果我想在编译时在float和double精度之间切换,我应该在哪里看看.就像,如果用户想要浮动而不是双精度,我怎么能保持这种灵活性呢?换句话说,我应该如何有条件地定义一个可以是float或double精度的变量?
在a中std::vector<unsigned int>,我想找到元素的位置,该位置是小于某个数字的最大数.例如:
v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Run Code Online (Sandbox Code Playgroud)
我想找一个小于8的最大数字.这个数字是7.
以下代码不正确,但这可能是我想要的.
std::vector<unsigned int>::iterator pnt = std::find_if (v.begin(), v.end(), [](const unsigned int& x) { return x < 8; && x == MAX; });
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,每次为第一个元素获取不同的地址std::vector v.为什么会这样?
#include <memory>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
for (int i=0; i<10; ++i)
{
int b = i;
v.push_back(b);
std::cout << std::addressof(v[0]) << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0x603010
0x603030
0x603010
0x603010
0x603050
0x603050
0x603050
0x603050
0x603080
0x603080
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,目的是foo组合调用每个元素vector<Grid> gr.是否有内置的STL功能,如果没有,对大型容器执行此操作的最佳方法是什么?注意,既然grid[0]影响grid[1]也是如此,grid[1]不应该调用该函数grid[0].所以,没有排列,只有组合.顺便说一句,这篇文章没有回答我的问题.
#include <iostream>
#include <vector>
using namespace std;
struct Grid
{
void foo (Grid& g) {}
};
int main()
{
vector<Grid> gr(3);
gr[0].foo (gr[1]);
gr[0].foo (gr[2]);
gr[1].foo (gr[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在我的代码中,每个进程都在数组的某个部分上工作.我希望每个进程将其处理的部分发送到其他进程,并从其他进程接收其他部分.为此,我使用MPI_Allgatherv但我保持发送和接收缓冲区相同:
MPI_Allgatherv (&vel[0], localSizesFaceV[rank], MPI_DOUBLE, &vel[0], localSizesFaceV, displsFaceV, MPI_DOUBLE, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)
之前我使用此函数用于其他目的,具有不同的发送和接收缓冲区并且它有效.这就是为什么我确信其他参数没有问题.
在2个进程的情况下,其中一个进程不返回.当我将发送缓冲区复制到另一个时std::vector
vector <double> vel2;
vel2 = vel;
Run Code Online (Sandbox Code Playgroud)
并用作vel2发送缓冲区,然后返回所有进程.为什么?
我有一个读取非结构化网格的代码。我围绕以下几何实体编写了包装器sympy.geometry:
class Point:
def __init__(self, x, y, parent_mesh):
self.shape = sympy.geometry.Point(x,y)
self.parent_mesh = parent_mesh
self.parent_cell = list()
Run Code Online (Sandbox Code Playgroud)
一切工作正常,但sympy.geometry.Point每个 的初始化都需要花费大量时间Point。实际上,代码还没有执行完数千点。用 C++ 编写的类似代码只需几秒钟即可完成。如果没有它,代码就足够快了(我删除了它并计时)。我读到一个可能的原因可能是sympy.geometry为了精度而将浮点数转换为有理数。有没有办法(标志)来加速,sympy.geometry因为我不需要精确的精度?