2013-08-31 44 views
0

當我在研究向量時,我注意到size()應該給出向量中元素的個數,對吧?所以,當我發現C++沒有內置函數字符串split()時,我決定做一個。問題是,vector.size()顯示爲在代碼中示出的相同的值vector.capacity()C++向量大小和容量輸出相同的值

#include <iostream> 
#include <algorithm> 

using namespace std; 

void split(string input, char chr, vector<string> list) { 
    string add; 
    string conv; 
    int size = 0; 
    for (int i = 0; i <= input.size(); i++) { 
     if ((input[i] != char(chr)) && (input[i] != 0)) { 
      conv = input[i]; 
      add += conv; 
     } 
     else { 
      cout << list.size() << endl; 
      if (size <= list.capacity()) { 
       list[size] = add; 
       add = ""; 
       size++; 
      } 
     } 
    } 
} 

int main() { 
    vector<string> list(6); 
    split("test1,test2", ',', list); 
    for (int i = 0; i < 2; i++) { 
     cout << list[i] << endl; 
    } 
} 

的輸出是這樣的:

6 
6 
<blank line> 
<blank line> 

而應該是這樣從我的理解:

1 
2 
test1 
test2 

編輯:如果這是重要的,我正在編譯與-std = C++ 11

+1

代碼備註:您正在使用'std :: string',因此您應該包含''; ''也一樣; 「'list'」可能是一個變量(特別是一個向量)的錯誤名稱,特別是全局的'using namespace std;';你的'split'函數需要一個vector_by value_,所以'list [size] = add;'只修改'main'中定義的vector的局部_copy_,它真的是你想要的嗎? (如果沒有,那麼通過引用採取向量:'void split(/*...*/,vector &list){/*...*/}')。 –

+0

另外''

+0

是啊,我擡起頭,我需要使用&,並且不需要使用'我<= list.capacity()',因爲當它到達最後一個字母時,將不會有任何東西來清除最後一個內容通過觸發'input [i] == 0'將'add'加入'list [size]'中,除非我把它放在for循環之外,我現在可以做的就是考慮它。 – cellsheet

回答

2

初始化大小爲6而不是容量爲6的向量。它將由內部的6個空元素構成,因此設置值0和1不會改變它。

你只看到空行的原因是你通過值傳遞向量而不是通過引用你的分割函數。

+0

在這種情況下,我如何初始化大小爲6的向量而不是6個空元素?我有一種感覺,這是發生了什麼,但我不知道有任何其他方式來做到這一點。另外,我怎麼能通過參考傳遞它? – cellsheet

+1

使用['std :: vector :: reserve'](http://en.cppreference.com/w/cpp/container/vector/reserve) – Erbureth

0
#include <iostream> 
#include <string> 
#include <vector> 

void split (const std::string& s, char sep, std::vector<std::string>& words) 
{ 
    if (s.empty()) return; 
    std::size_t beg = 0; 
    std::size_t end = s.find(sep, beg); 

    while (end != std::string::npos) 
    { 
     words.push_back(s.substr(beg, end - beg)); 
     beg = end + 1; 
     end = s.find(sep, beg); 
    } 
    words.push_back(s.substr(beg)); 
} 

int main() { 
    std::vector<std::string> words; 
    split("test1,test2", ',', words); 
    for (std::size_t i = 0; i != words.size(); ++i) { 
     std::cout << words[i] << std::endl; 
    } 
    return 0; 
} 
+2

嗯,這可能有效(我沒有測試它,但我想你做的),但是代碼不值得一點解釋嗎? (另外,爲什麼要將'split'重命名爲'Split',爲什麼'vector'和'string'使用'std ::'而不使用'size_t',其中包括'#include's?) –

相關問題