繁体   English   中英

用于并行化的 C++ 中的字符串数组

[英]Array of strings in C++ for parallelization

我正在将一个项目从 Python 转移到 C++,但一开始就被卡住了,我必须决定应该使用哪种数据结构。 我有一个包含数百万个小数据文件的数据库,这些文件的名称类似于1986_12_04_23_43_34_458239_VpLGMI (数据文件的名称可以在长度和类型上有所不同)。 我想将文件名加载到数据结构中,然后我可以从中快速搜索文件名中的子字符串。

由于过去几年我主要使用 Python 工作,因此我不确定应该采用哪种方法。 在 C++ 中有很多方法可以将字符串存储在数组中。 现在我数三:

  • 字符串类std::string
  • 向量类std::vector
  • 二维数组

我猜二维数组不是一个好的选择,因为它们不是很灵活。 如果我以后想并行化搜索,我应该遵循哪种方法?

第一个选项应该是std::vector<std::string> ,由于使用了并行算法,您可以使用find并行版本进行O(N)复杂度的find

#include <algorithm>
#include <vector>
#include <execution>
#include <string>

std::vector<std::string> v;
std::string someString = "someName";
v.push_back(someString);
auto res = std::find(std::execution::par, 
 std::begin(v), std::end(v), someString);
// res is an iterator to an element of which
//has someString

您可以通过对向量进行排序,然后使用std :: lower_bound (使用二进制搜索)代替std::find来提高复杂性。

也可以按照@jjramsey的建议,使用std :: set以排序形式存储字符串,并使用O(log N)搜索单个元素或具有O(1)复杂度的std::unordered_set 类似的std::mapstd::unordered_map

但是,在这些容器中,您需要为插入操作支付一些开销。

请注意,算法的并行版本需要C ++ 17。 生活

我很确定,由于您同时拥有整数和字符串,因此存储它的唯一方法是通过并行数组结构。 在C ++中,您不能将多个数据类型放入同一数组变量中。 这就是为什么您不能使用2d数组使其起作用的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM