是否存在提供切片操作而不创建新字符串副本的C++字符串类?(有点像go编程语言中的string )
awesome::CString s = "this is an awesome string";
awesome::CString s1 = s.Mid(8, 10); // contains "an awesome" but not new copy
if (s1 == "an awesome") {
awesome::CString s2 = s.Mid(11); // contains " string"
}
std::string str = s.str(); // create a copy that is the usual string我认为go的实现在解析字符串数据(例如解析APDU)时效率更高。
发布于 2014-04-11 09:55:14
但是,我相信存储引用的类可能是最好的解决方案。
这并不完全如您所愿,因为仍会创建一个临时副本来给您提供子字符串。但结果正如预期的那样,我认为它在安全性和可读性之间取得了平衡,而不是使用hacks之类的,因为STL显式地说不对底层字符串存储进行假设。
#include <iostream>
#include <cstring>
using namespace std;
class stringRef {
public:
string & src;
size_t i;
size_t s;
stringRef(string &ssrc, size_t i_pos, size_t i_spam):src(ssrc){
i=i_pos;
s=i_spam;
}
operator const string(){
return string(src.substr(i, s));
}
};
int main() {
string s("this is an awesome string");
stringRef s1(s, 8, 10); //initializes [s1] bound to [s]
cout << (string)s1 << endl; //prints [s1]
s=" quite a cool workaround"; //modifies [s]
cout << (string)s1 << endl; //prints [s1]
return 0;
}将输出:
an awesome
cool work这样你就可以改进这个类来做任何你想做的事情=)
发布于 2014-04-12 00:36:55
class AwesomeString {
private:
struct AwesomeData {
std::string str;
size_t refcnt;
AwesomeData( const char *that ) {
str = std::string(that);
refcnt = 1;
}
};
AwesomeData *data;
size_t from, to;
public:
AwesomeString( const char *str ) {
data = new AwesomeData(str);
from = 0;
to = data->str.length();
}
AwesomeString( const AwesomeString &other, size_t begin, size_t end) {
// Here is where the interesting part begins:
data = other.data; // reference the same data
data->refcnt++; // increment reference count
from = begin;
to = end;
}
~AwesomeString() {
data->refcnt--; // decrement reference count
if(refcnt == 0) {
// delete data on deletion of the last object that references it
delete data;
}
}
operator const string() {
return data->str.substr(from, to);
}
};我在这里试图指出的是,指针/引用指向具有良好控制生命周期的对象:保证指向AwesomeData的指针数据永远不会指向已删除的对象。
https://stackoverflow.com/questions/23001915
复制相似问题