2015-06-06 60 views
0

我試圖做一個函數,接受字符串作爲輸入的恆定參考和字符串的每個字符旋轉1點到右邊後返回字符串。使用引用和指針仍然讓我困惑,我不知道如何從常量引用獲取字符串。功能的不斷引用作爲輸入

string rotate(const string &str){ 
    string *uno = &str; 
    string dos = rotate(uno.rbegin(), uno.rbegin() + 1, uno.rend()); 
    return dos;} 

這是我到目前爲止,但它不編譯。將不勝感激關於如何從常量引用正確獲取字符串的任何提示。

回答

7

你不能在不違反有關的參數const合同執行就地旋轉,所以你應該拷貝輸入,並返回一個新的字符串:

string rotate(const string &str){ 
    string uno = str; 
    rotate(uno.rbegin(), uno.rbegin() + 1, uno.rend()); 
    return uno; 
} 

另一個合理的選擇是使用std::rotate_copy

+0

這沒有爲我編譯。 – user3699546

+1

@ user3699546:什麼是錯誤? –

+0

/usr/bin/ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位0的符號索引無效11 /usr/bin/ld:/ usr /lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):搬遷1具有無效符號索引12 它的推移和像,對於約40行。 – user3699546

2

string* uno = string &str; 

是沒有意義的。我想你的意思

string* uno = const_cast<string*>(&str); 
+2

除了這會因試圖擺脫const而導致編譯器錯誤。 – chris

+0

@chris:好點。讓我來解決這個問題...... – Levi

+1

這將導致UB而不是一個編譯器錯誤 –

1

你可能會考慮這個旋轉:

// rotate last char to front 
std::string rotate(const std::string& str) 
{ 
    return(str[str.size()-1] + 
      str.substr(0,str.size()-1)); 
} 

// 'abcdefghijklmnopqrstuvwxyz' 
// 'zabcdefghijklmnopqrstuvwxy' 
1

你可以在一個字符串傳遞給接收旋轉的字符串,從而避免值拷貝回報。

我在傳遞的字符串指針通過,因爲它在它的預期被改變調用點清晰,但它很容易被引用,如果首選傳遞。

#include <string> 
#include <iostream> 
#include <algorithm> 

void rotate(std::string const& str, std::string* out) 
{ 
    *out = str; 
    std::rotate(out->rbegin(), out->rbegin() + 1, out->rend()); 
} 

int main(int, char**) 
{ 
    std::string out; 

    std::string x = "1234567"; 
    std::cout << x << '\n'; 

    ::rotate(x, &out); 

    std::cout << out << '\n'; 
}