0

当我调用下面的函数时,它会将我的输入添加到向量中,但始终会向向量中添加 6 个额外的单元格。任何想法为什么会发生?

这是相关的功能:

void seperate_words(string str1, vector<struct wordstype> &vec1)
{
    string temp_str;
    string::iterator is=str1.begin();
    wordstype input_word;
    while (is<str1.end())
    {
        if (((*is)!='-')&&((*is)!='.')&&((*is)!=',')&&((*is)!=';')&&((*is)!='?')&&((*is)!='!')&&((*is)!=':'))
        {
            temp_str.push_back(*is);
            ++is;
        }
        else
        { 
            input_word.word=temp_str;
            vec1.push_back(input_word);
            is=str1.erase(is);
            temp_str.clear();
        }
    }
    input_word.word=temp_str;
    vec1.push_back(input_word);
    temp_str.clear();
}

调用func的主程序的相关区间为:

**while(end_flag==-1){
    cin>> temp_string;
    end_flag=temp_string.find(end_str);/*indicates whether the end sign is precieved*/
    seperate_words(temp_string,words_vecref);/*seperats the input into single words and inserts them into a vector*/
} 
int x=words_vec.size();
cout<<x<<" "<<std::endl;
for (vector<struct wordstype>::iterator p_it=words_vec.begin();p_it<words_vec.end();p_it++)
 {cout<<(*p_it).word<<" ";}**

例如:我走在街上,我的向量大小应该只增加 6 个元素(而不是 12 个)

预期输出:只有六个单元格,在每个 oe 中,将是输入中的一个单词,按输入顺序排列。

4

4 回答 4

2

你的字符串末尾有六个标点符号吗?当文本以标点符号结尾时,您会在向量中添加一个额外的空字符串(因为您在 while 循环之外无条件地添加到向量中)

如果你有其中的几个,你就有几个空字符串(这次在 while 循环内)。这些空字符串也可以出现在文本的中间。

这是因为您在推回时不会测试您实际遇到某些文本的位置。您可以通过在 while 循环中调用 push_back 之前和 while 循环之后测试 temp_str 是否不为空来解决此问题。

于 2012-04-19T13:50:13.440 回答
1

当您尝试将元素添加到当前容量无法容纳更多元素的向量时,将调整向量的大小。

如果容量每增加 1 个新的push_back,就会产生巨大的开销。

于 2012-04-19T13:33:59.413 回答
0

你打电话

vec1.push_back(input_word); 

循环内。

于 2012-04-19T13:33:36.857 回答
0

你确定是这个函数添加了额外的元素吗?您是否使用调试器对其进行了跟踪?大概您是在通话前后直接检查size()而不是检查向量?capacity()如果输入字符串中没有任何“特殊”字符会怎样?

我注意到在您的else块中,您可能会temp_str为推到向量上的对象分配一个空白。也许这与它有关?

于 2012-04-19T13:50:00.040 回答