是否可以在 C++ 中创建一个子字符串作为指向与原始字符串相同的内存的指针?
假设我有一个字符串s = "just testing"
和一个函数f
。我希望函数 f 返回一个常量字符串对象(用户不能更改它),这将是一个子字符串,s
我想f
以最有效的方式创建这个子字符串。
我唯一的想法是返回一对指针 - 在子字符串的开头和结尾,但我很想给最终用户f
返回一个对象的“感觉”,他可以打印它,迭代它等等
在 C++ 中可能吗?
是否可以在 C++ 中创建一个子字符串作为指向与原始字符串相同的内存的指针?
假设我有一个字符串s = "just testing"
和一个函数f
。我希望函数 f 返回一个常量字符串对象(用户不能更改它),这将是一个子字符串,s
我想f
以最有效的方式创建这个子字符串。
我唯一的想法是返回一对指针 - 在子字符串的开头和结尾,但我很想给最终用户f
返回一个对象的“感觉”,他可以打印它,迭代它等等
在 C++ 中可能吗?
是的,这是可能的。
您应该编写自己的类作为子字符串开头和结尾的包装器。
这段代码不完整,但显示了方向。
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
}
您可以简单地迭代和打印它。