首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提供`slice`操作的C++字符串类(不创建新的字符串副本)

提供`slice`操作的C++字符串类(不创建新的字符串副本)
EN

Stack Overflow用户
提问于 2014-04-11 09:23:45
回答 2查看 113关注 0票数 1

是否存在提供切片操作而不创建新字符串副本的C++字符串类?(有点像go编程语言中的string )

代码语言:javascript
复制
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)时效率更高。

EN

回答 2

Stack Overflow用户

发布于 2014-04-11 09:55:14

但是,我相信存储引用的类可能是最好的解决方案。

这并不完全如您所愿,因为仍会创建一个临时副本来给您提供子字符串。但结果正如预期的那样,我认为它在安全性和可读性之间取得了平衡,而不是使用hacks之类的,因为STL显式地说不对底层字符串存储进行假设。

代码语言:javascript
复制
#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;
}

将输出:

代码语言:javascript
复制
an awesome
 cool work

这样你就可以改进这个类来做任何你想做的事情=)

票数 1
EN

Stack Overflow用户

发布于 2014-04-12 00:36:55

代码语言:javascript
复制
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的指针数据永远不会指向已删除的对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23001915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档