【问题标题】:C++ substring on pointers指针上的 C++ 子字符串
【发布时间】:2013-04-06 01:04:11
【问题描述】:

是否可以在 C++ 中创建一个子字符串作为指向与原始字符串相同的内存的指针?

假设我有一个字符串s = "just testing" 和一个函数f。我希望函数 f 返回一个常量字符串对象(用户无法更改它),它将是 s 的子字符串,我希望 f 以最有效的方式创建此子字符串。

我唯一的想法是返回一对指针——在子字符串的开头和结尾,但我很想给最终用户f返回一个对象的“感觉”,他可以打印它,迭代它等等。

在 C++ 中可以吗?

【问题讨论】:

  • ...和 ​​Qt 中的 QStringRef
  • 是的,当然这是可能的,但最好有更安全的设施,而不是简单的 2 个原始指针。 IE。您需要一个能够提供此功能的类,并将客户端从其实现方式中抽象出来。
  • 谢谢!如果我不使用 QT,是否有任何理由(性能、灵活性等)我应该使用 QStringRef 而不是 boost ?
  • 如果你没有使用 Qt,那么为了获得这个功能就没有必要在你的项目上强加像 QtCore 这样的重量级依赖。坚持使用 Boost,我怀疑你会遇到任何性能瓶颈。

标签: c++ string performance memory


【解决方案1】:

是的,有可能。

您应该编写自己的类作为子字符串开头和结尾的包装器。

这段代码不完整,但显示了方向。

class string_ref
{
    std::string::iterator b, e; // begin and end
public:
    string_ref(std::string::iterator b, std::string::iterator e) : b(b), e(e){}

    std::string to_string() const {
        return std::string(b, e);
    }

    std::string::iterator begin() const {
        return b;
    }

    std::string::iterator end() const {
        return e;
    }
    // ... Code to complete this class ... //
};

std::ostream &operator<<(std::ostream &out, const string_ref &str) {
    // out << str.to_string();
    for (std::string::iterator i = str.begin(); i != str.end(); i++) cout << *i;
    return out;
}

int main() {
    std::string s = "Hello";
    string_ref sr(s.begin(), next(s.begin(),3)); // pick first 3 charaters
    cout << sr << endl;                          // print it by cout
}

您可以简单地迭代和打印它。

【讨论】:

  • 您仍然通过to_string() 进行复制。作者要求的是对原始字符串的部分进行只读 "view" 。换句话说,不应该发生额外的内存分配。因此,这种实现有点幼稚。
  • @Haroogan: 当您想在其他 STL 旁边使用 string_ref 时,to_string() 是必需的。存储开始和结束迭代器的是“view”。而且它没有额外的内存分配,你能给我看一下吗? (此代码基于著名的 boost 和 Qt 方法来存储子字符串)
  • 我已经告诉过你,使用to_string() 时会引入额外的内存分配。是的,确实需要使用标准库代码进行操作。但是,例如,在您的情况下,operator&lt;&lt; 的实现通过使用to_string() 来分配不必要的内存,而不是直接向流提供字符。
  • 我同意,这不是最好的,但代码的主要目标只是展示包装这两个迭代器以及如何重载与string_ref 一起使用的operator&lt;&lt;。此外,这是在操作期间临时分配的内存,在 string_ref 存在期间不会永久分配。
  • 我添加了一段代码,表明我们可以避免在 operator&lt;&lt; 中使用 to_string
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2021-06-28
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多