我想把一个字符串分成1024个块,就像这样。
std::string content;
std::vector<std::string_view>
data{_iterator<std::string>{content, 1024},
_iterator<std::string>{}};
这是优雅和有效的,但我不知道该做什么。
可能没有您想要的那么优雅,但请尝试这样做:
std::string content = ...;
std::vector<std::string_view> data;
if (!content.empty())
{
data.reserve((content.size() + 1023) / 1024);
std::string_view content_view = content;
size_t i = 0;
do
{
data.push_back(content_view.substr(i, 1024));
i += data.back().size();
}
while (i < content.size());
}
另外:
std::string content = ...;
std::vector<std::string_view> data;
if (!content.emoty())
{
data.reserve((content.size() + 1023) / 1024);
const char* ptr = content.c_str();
size_t size = content.size();
for(size_t i = 0; i < size; i += 1024) {
data.emplace_back(ptr+i, std::min(size-i, 1024));
}
}
如果你真的想用块大小的迭代器初始化vector
,你必须从头开始编写你自己的迭代器类来处理它。没有标准的迭代器类可以迭代包含N个元素的块中的字符串(或任何其他容器)。
这是我现在能想到的最优雅的方式。
std::string_view data = content;
std::vector<std::string_view> chunks;
for (int i = 0; i < data.size(); i += 1024)
chunks.push_back(data.substr(i, 1024));
使用c++ 23,这可以写得非常优雅:
#include <ranges>
auto data = content
| std::views::chunk(1024)
| std::ranges::to<std::vector<std::string>>();
由于我不知道的原因,我不能使std::vector<std::string_view>
工作。