2013-04-13 31 views
4

C++中是否可以創建一個子串作爲指向與原始字符串相同內存的指針?指針上的C++子串

可以說我有一個字符串s = "just testing"和函數f。我想函數f返回一個常量字符串對象(用戶無法更改它),這將是一個子字符串s,我想f創建此子字符串最有效的方法。

我唯一的想法是返回一對指針 - 在子串的開始和結尾,但我想給最終用戶「感覺」,f返回一個對象,他可以打印它,迭代它等。

它可能在C++?

+1

請參閱http://www.boost.org/doc/libs/1_53_0/libs/utility/doc/html/string_ref.html – hmjd

+0

...和['QStringRef'](http:// harmattan-dev。 nokia.com/docs/library/html/qt4/qstringref.html)在Qt – deepmax

+0

是的,當然這是可能的,但最好有更安全的設施,然後只需2個原始指針。即您需要一個能夠提供此功能的類,並從實現方式中抽象出客戶端。 –

回答

4

是的,這是可能的。

你應該把你自己的類寫成子字符串開始和結尾的包裝。

此代碼不完整,但顯示方向。

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 
} 

您可以簡單地進行迭代和打印。

+0

您仍然通過'to_string()'做一個副本。作者要求的是對原始字符串的一部分進行只讀_「查看」_。換句話說,不應該發生額外的內存分配。因此,這種實現有點幼稚。 –

+0

@Haroogan:當你想在其他STL旁邊使用'string_ref'時,'to_string()'是必須的。存儲開始和結束迭代器是「_view_」。它沒有額外的內存分配,你會顯示給我嗎? (這段代碼基於着名的boost和Qt方法來存儲子字符串) – deepmax

+1

我已經告訴過你在使用'to_string()'時會引入額外的內存分配。是的,確實需要使用標準庫代碼進行操作。然而,例如,在你的情況下'operator <<'的實現通過使用'to_string()'來完成這種不必要的內存分配,而不是直接給字符串提供字符。 –