c ++矢量大小和容量输出相同的值

时间:2013-08-31 13:33:53

标签: c++ string stdvector

当我研究向量时,我注意到size()应该给出向量中的元素数量,对吧?所以,当我发现c ++没有内置的字符串split()函数时,我决定制作一个。问题是,vector.size()显示与vector.capacity()相同的值,如代码所示:

#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

进行编译

2 个答案:

答案 0 :(得分:2)

初始化大小为6的向量,而不是容量6.它将在内部构造有6个空元素,因此设置值0和1不会改变它。

您只看到空白行的原因是您按值传递矢量而不是通过引用分割函数。

答案 1 :(得分: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;
}