将std :: vector <char>转换为std :: vector <t>转换C ++

时间:2019-01-29 17:39:14

标签: c++

我想从长度为var a =[ "https://www.example.com", "http://www.example.com", "www.example.com", "example.com", "http://blog.example.com", "http://www.example.com/product", "http://www.example.com/products?id=1&page=2", "http://www.example.com#up", "https://www", "https://www.", "https://www.exampledomain", "https://www.axiamed.com", "https://www.axiamed.com/independent-software-vendors/", ]; a.forEach(function(url) { var result =/^(http:\/\/www\.|https:\/\/www\.)[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/.test(url); if(result){ console.log(url+" TRUE"); } else{ console.log(url+" FALSE") } });的{​​{1}}中包含的序列化数据中创建长度为std::vector<T>的{​​{1}},而不在不必要时不复制数据(这可能不是例如,可能需要对齐len)。 换句话说,我正在寻找以下代码的优化,并在相同的保证下运行:

std::vector<char>

其中

  • 尽可能避免复制
  • 否则,如果可能,在一次len * (sizeof T)调用中复制所有字节
  • 或在均无法实现时退回至上述实现或等效项。

是否有标准方法或可移植库来实现这一目标(或“足够好”的近似值)?

说明:

  • 我只需要假设T是可复制的,并且输入template<typename T> auto copyStuff(std::vector<char>&&input) { std::vector<T> result; result.resize(input.size()/(sizeof T)); for (int i=0; i < result.size(); i++) { memcpy(&result[i], &input[i * (sizeof T)], sizeof T); } return result; } 的布局只是我要构造的项的内存表示的串联。 / li>
  • 我正在寻找一种确定自己在进行优化时不会陷入未定义或实现定义的行为的方法
  • 如果非标准容器库提供这种开销低的类型修剪功能,我愿意考虑使用它们(而不是memcpy)。

1 个答案:

答案 0 :(得分:4)

如果不复制,则不可能从另一种类型中获取一种类型的向量。

通过首先构建T(足够大)的向量,然后将序列化的数据直接写到该向量上而不使用chars的中间向量,可以避免一组副本。

一些警告:

  • 直接复制数据将意味着该数据无法以不同的字节序或其他不同的数字表示形式移植到CPU,因此这种序列化形式不适用于跨系统的通信(例如网络,共享文件)。
  • li>
  • T必须是可复制的类型。