我有一个Node.js项目,我正在使用Jest进行测试.我有几个具有相同设置要求的测试文件.以前,所有这些测试都在一个文件中,所以我只有一个beforeAll(...)执行常见设置.现在,将测试分成多个文件,似乎我必须将该beforeAll(...)代码复制/粘贴到每个文件中.这似乎是不优雅的 - 有没有更好的方法来做到这一点,理想情况下,我可以只编写我的beforeAll(...)/设置逻辑一次,并从多个测试文件"需要"它?请注意,我的测试套件中还有其他测试不需要此设置功能,所以我不想让我的所有测试运行此设置(只是测试文件的特定子集).
我有一些 C++11 代码,比如
std::vector<std::string> names;
std::map<std::string, std::string> first_to_last_name_map;
std::transform(names.begin(), names.end(), std::inserter(first_to_last_name_map, first_to_last_name_map.begin()), [](const std::string& i){
if (i == "bad")
return std::pair<std::string, std::string>("bad", "bad"); // Don't Want This
else
return std::pair<std::string, std::string>(i.substr(0,5), i.substr(5,5));
});
Run Code Online (Sandbox Code Playgroud)
我使用带有 lambda 函数的 std::transform 将向量转换为地图。我的问题是,有时,如图所示,我不想从我的 lambda 函数返回任何内容,即我基本上想跳过那个i并转到下一个(不向地图添加任何内容)。
有什么方法可以实现我的想法吗?如果有帮助,我可以使用 boost。我想避免一个解决方案,我必须对我的向量进行预处理或后处理以过滤掉“坏”项目;我应该只需要查看每个项目一次。此外,我的实际逻辑比所写的 if/else 更复杂一些,所以我认为如果可能的话,将事情封装在这个 std::transform/lambda 模型中会很好(尽管也许我正在努力实现这个模型是不可能的)。
编辑:只是为了强调,我希望以最有效的方式执行此操作(有选择地处理向量元素并将它们插入到地图中),即使这意味着不太优雅的解决方案或大的重写。我什至可以根据最有效的方式使用不同的地图数据类型。
我有一个用例来创建std::vector具有许多元素的 ,每个元素都是简单但非原始的类型(POD 结构)。向量和类型足够大/复杂,在下面,
std::vector<U> v;
v.resize(1000000000);
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
Run Code Online (Sandbox Code Playgroud)
该resize呼叫是明显减慢。这很浪费,因为resize默认初始化所有这些条目,然后我循环遍历并将它们全部设置为正确/有用的值。
我想做的是为向量分配所有内存,但不初始化任何条目,然后并行执行并初始化所有条目,例如使用 OpenMP
std::vector<U> v;
v.reserve(1000000000);
#pragma omp parallel for
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
Run Code Online (Sandbox Code Playgroud)
但是,reserve实际上并没有改变 的大小v,所以我必须继续push_back在我的循环中进行,这不会保持元素的正确顺序(这在我的用例中很重要);我真的很想v[i] = ...在我的循环体中写一些类似的东西。
有没有办法在不初始化任何元素的情况下分配/“初始化”一个向量,然后并行填充/初始化所有元素?
我有一些 C++ 代码,如下所示:
#include <memory>
void do_memory()
{
std::unique_ptr<int[]> ptr = std::make_unique<int[]>(50);
int* ptr2 = new int[50];
delete[] ptr2;
}
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我创建一个指向 int 数组的唯一指针,在第二种情况下,我分配一个原始 int 数组。当离开作用域时,两个数组都会被清理干净。玩弄这段代码(例如https://godbolt.org/g/c3gEfV),我发现这两组指令的优化汇编是不同的,因为make_unique执行值初始化(具体来说,它似乎设置了将数组分配给 0)。make_unique引入一些不必要的开销也是如此。
在不unique_ptr自动值初始化的情况下将 a 分配给数组(如上所示)的推荐方法是什么?我已经尝试过例如
std::unique_ptr<int[]> ptr = std::unique_ptr<int[]>(new int[50]);
Run Code Online (Sandbox Code Playgroud)
但在我的应用程序中,我也有一个限制,即我在编译时不知道数组的大小,因此我不想分配任何具有(编译时)常量大小的数组。
我有一个简单的C++结构,基本上包装一个标准的C数组:
struct MyArray {
T* data;
int length;
// ...
}
Run Code Online (Sandbox Code Playgroud)
其中T是数字类型,如float或double. length是数组中元素的数量.通常我的阵列非常大(数万到数千万个元素).
我有一个MPI程序,我希望通过MPI 3共享内存公开两个MyArray,例如a_old和a_new作为共享内存对象的实例.上下文是每个MPI等级读取a_old.然后,每个MPI等级写入某些索引a_new(每个等级只写入其自己的索引集 - 没有重叠).最后,a_old = a_new必须设置所有级别. a_old并且a_new大小相同.现在我通过将Isend/Irecv每个等级的更新值与其他等级同步()来使我的代码工作.但是,由于数据访问模式,我没有理由需要承担消息传递的开销,而是可以使用一个共享内存对象,然后再设置一个屏障a_old = a_new.我认为这会给我更好的表现(但如果我错了请纠正我).
我在查找使用MPI 3共享内存的完整代码示例时遇到了麻烦.大多数站点仅提供参考文档或不完整的代码段.有人可以通过一个简单而完整的代码示例来完成我正在尝试实现的事情(通过MPI共享内存更新和同步数字数组)吗?我理解创建共享内存通信器和窗口,设置围栏等的主要概念,但它确实有助于我的理解,看到一个将它们放在一起的例子.
另外,我应该提一下,我只会在一个节点上运行我的代码,因此我不需要担心跨节点需要多个共享内存对象副本; 我只需要为我的MPI进程运行的单个节点提供一份数据副本.尽管如此,在这种情况下,像OpenMP这样的其他解决方案对我来说也不可行,因为我有大量的MPI代码,并且为了我想分享的一个或两个数组而无法重写所有内容.