【问题标题】:What the easiest way to convert part of a vector to string?将部分向量转换为字符串的最简单方法是什么?
【发布时间】:2021-07-21 20:03:09
【问题描述】:

我想将向量的一部分转换为字符串,我发现了这个 std::string myString(Buffer.begin(), Buffer.end());(缓冲区是向量)

但在这里我转换了整个向量。如果我想跳过向量的前 5 个字符并转换其余字符,最简单的方法是什么?就像''.join(Buffer[5::]) 如果是python。

【问题讨论】:

  • std::string myString(std::next(Buffer.begin(), 5), Buffer.end());?小心不要超出范围。
  • 你为什么删除这个问题stackoverflow.com/questions/67796973/…
  • @Enigmativity 该问题已被删除,因为有很多类似的问题。但是你的回答对我有帮助,谢谢。
  • 最好保留这些问题,即使它们是重复的。人们在搜索时经常会遇到重复的问题。

标签: c++ string vector type-conversion


【解决方案1】:

只需将您的偏移量添加到begin。由于 vector 具有随机访问迭代器,因此您可以使用

std::string myString(Buffer.begin() + 5, Buffer.end());

如果你不确定你的容器使用的是什么类型的迭代器,你可以使用std::nextlike

std::string myString(std::next(Buffer.begin(), 5), Buffer.end());

它将处理所有迭代器类型,它也可能是一个 O(N) 操作。

在执行此操作之前,您还需要确保容器的大小至少为5,否则如果容器太小,您将出现未定义的行为。

【讨论】:

    【解决方案2】:

    例如这样:

    if (Buffer.size() >= 5) {
        std::string myString(
            Buffer.begin() + 5,
            Buffer.end());
    

    一种更通用的方法,也适用于非随机访问迭代器(例如 std::list 的迭代器):

        std::string myString(
            std::next(Buffer.begin(), 5),
            Buffer.end());
    

    或者使用范围:

        auto subrange = Buffer | std::ranges::views::drop(5);
        std::string myString(
            std::ranges::begin(subrange),
            std::ranges::end(subrange));
    

    【讨论】:

      【解决方案3】:

      一种安全的(避免越界访问),一般的方法可能是

      std::string myString(std::next(Buffer.cbegin(), std::min(5, Buffer.size()),
                           Buffer.cend());  //        ^^^^^^^^^^^^^^^^^^^^^^^^^
      

      【讨论】:

        猜你喜欢
        • 2012-01-07
        • 2012-02-05
        • 1970-01-01
        • 2012-08-01
        • 2011-09-28
        • 1970-01-01
        相关资源
        最近更新 更多