2013-08-31 48 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?) –

相关问题