有没有办法将 std::vector<std::shared_ptr<std::string>> 转换为 std::vector<std::string> 而不复制?

L.M*_*ple 1 c++

问题是我有一个大vector包含从本地缓存获取的大string内容,包装如下shared_ptr

std::vector<std::shared_ptr<std::string>>
Run Code Online (Sandbox Code Playgroud)

但我的库 API 之一需要:

void forExample(std::vector<std::string>& data);
Run Code Online (Sandbox Code Playgroud)

在这个库中,数据只会被读取,没有修改,没有内存操作,只是读取。

那么如何在不复制大字符串的情况下正确传递数据,或者有其他更好的建议?如有必要,可以更改库 API 签名。

for*_*818 8

更改签名自

// bad
void forExample(std::vector<std::string>& data);
Run Code Online (Sandbox Code Playgroud)

// better
template <typename IT> 
void forExample(It begin, IT end);
Run Code Online (Sandbox Code Playgroud)

需要更多一点来约束迭代器。但是,一旦您传递迭代器而不是整个容器,您就可以编写一个迭代器适配器,当迭代器被取消引用时,该适配器也会取消对智能指针的引用。

  • `void forExample(std::ranges:: view auto rng);` 会更方便。 (2认同)