2017-08-08 108 views
3

如果考慮轉換,我應該合理能夠將char s存儲在字符串的std::vector中。將提取的字符存儲在字符串向量中

這裏是嘗試:

vector<string> f (vector<string> input) 
{ 
    vector<string> output; 
    for (int i=0; i<input.size(); i++)     // vector iteration 
    { 
     for (int j=0;j<input[i].size(); j++)   // string iteration 
     { 
      output.push_back(string(input[i].at(j))); // access to characters 
     } 
    } 

    return output; 
} 

input[i]string,並且input[i].at(j)char;因此,我已將其轉換爲string,然後再推送至vector<string>

我想知道這種方法有什麼問題。特別是,編譯器的錯誤是不可破譯的對我說:

invalid conversion from '__gnu_cxx::__alloc_traits<std::allocator<char> >::value_type {aka char}' to 'const char*' [-fpermissive] 

編輯:

f必須的工作方式如下。

假設input載體中有3個字符串:{abcd,efdr,loab};屆時,output將提取所有atormic字符,如:{abcdefdrloab}

+0

使用iterator爲應對 –

+0

@HariomSingh:你能明確說明的一點一點嗎? –

+0

您可以從錯誤消息中看到原因:它們不能從'char'轉換爲'const char *'。 'char'是你的輸入[i] .at(j),通過檢查字符串的構造函數,它不接受'char',但它確實接受'char *'指向的地址,一個數字表示有多少' char'將從該地址獲取。 –

回答

2

要糾正你的錯誤變化

output.push_back(string(&input[i].at(j))); 

output.push_back(string(input[i].at(j))); 

基本上

**for (int i=0; i<input.size(); i++) \\vector iteration** 

這是一個錯誤的方式迭代。對於容器迭代器應該被用於從一個矢量迭代

下面複製串

#include <iostream> 
#include <iterator> 
#include<vector> 
#include<string> 
#include<algorithm> 

using namespace std; 
vector<string> f (vector<string> input) 
{ 
    vector<string> output; 
    copy(input.begin(),input.end(),back_inserter(output)); 

    return output; 
} 

int main() 

{ 
    vector<string> h{"hello"},x; 
    x=f(h); 
    copy(x.begin(),x.end(),ostream_iterator<string>(cout," ")); 
} 

輸出

hello Program ended with exit code: 0 

但是,爲了回答你(迭代器和STL可以使用copy_if或lambda的使用)您的代碼的問題和解決辦法

以下是修改後的代碼

#include <iostream> 
#include <iterator> 
#include<vector> 
#include<string> 
#include<algorithm> 

using namespace std; 

vector<string> f (vector<string> input) 
{ 
    vector<string> output; 
    for (int i=0; i<input.size(); i++) 
    { 
     for (int j=0;j<input[i].size(); j++) 
     { 
      output.push_back(string(&input[i].at(j))); 
     } 
    } 

    return output; 
} 
vector<string> fi (vector<string> input) 
{ 
    vector<string> output; 
    copy(input.begin(),input.end(),back_inserter(output)); 

    return output; 
} 

int main() 

{ 
    vector<string> h{"hello"},x,y; 
    x=fi(h); 
    y=f(h); 
    copy(x.begin(),x.end(),ostream_iterator<string>(cout," ")); 
    copy(y.begin(),y.end(),ostream_iterator<string>(cout," ")); 

} 

輸出

hello hello ello llo lo o Program ended with exit code: 0 

解決方案編輯

#include <iostream> 
#include <iterator> 
#include<vector> 
#include<string> 
#include<algorithm> 
#include <numeric> 

using namespace std; 

template<typename T, typename... Args> 
void push_back_vec(std::vector<T>& v, Args&&... args) 
{ 
    (v.push_back(args), ...); 
} 


int main() 

{ 
    vector<string>x; 
    push_back_vec(x, "abc", "cds", "ma"); 

    string a = accumulate(x.begin(), x.end(), string("")); 
    cout<<a; 
} 

輸出

abccdsmaProgram ended with exit code: 0 

更容易格式後

#include <iostream> 
#include <iterator> 
#include<vector> 
#include<string> 
#include<algorithm> 
#include <numeric> 

using namespace std; 

int main() 

{ 
    vector<string>x{"abc", "cds", "ma"},a; 
    a.push_back(accumulate(x.begin(), x.end(), string(""))); 
    copy(a.begin(),a.end(),ostream_iterator<string>(cout," ")); 

} 
+0

改進後的'f'似乎並不遵循預期的邏輯,例如'input = {abc,cds,ma}'必須導致{abccdsma},但'輸出'是不同的。 –

+0

您可以將此添加到您的查詢中,以便我可以添加解決方案 –

+0

添加了您的一組輸入和預期輸出,以便它可以幫助其他人 –

0

試試這個string(1, input[i].at(j))