在 C++ 中使用 for & while 循环正确使用 push_back for vector<vector<string>> ?

问题描述

基本上我有字符串形式的图像坐标。我有这 2 个字符串的向量,并且我正在使用一些分隔符解析它。解析正确完成,并且第一个 push_back 到 vector"" vector1 也是如此。但是,当我在 while 循环之后再次应用 push_back 将 vector1 存储在 vector">" vector2 中时(因为我想稍后构建多个 vector""s) vector2 的结果重复了 vector1[0] 2 次,答案是 123456123456789101112。我想要 123456789101112。

我做错了什么? 出于提问的目的,我自己构建了示例 vector"" 结果; 但我是从原始代码中的另一个函数获取的。

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;

    int main()
    {
    size_t beg,pos = 0;
    string s = "[[[1 2]] [[3 4]] [[5 6]]]";
    string t = "[[[7 8]] [[9 10]] [[11 12]]]";
    vector<string> resultvec;
    resultvec.push_back(s);
    resultvec.push_back(t);

    string const delims{ "[] " };

    vector<string> vector1;
    vector<vector<string>> vector2;

    for(int i=0; i<resultvec.size(); i++)
    {
        while ((beg = resultvec[i].find_first_not_of(delims,pos)) != string::npos)
        {
            pos = resultvec[i].find_first_of(delims,beg + 1);
            {
                vector1.push_back(resultvec[i].substr(beg,pos - beg));
                //cout << resultvec[i].substr(beg,pos - beg) << endl;
            }
        }
            
        beg = 0;
        pos = 0;
        vector2.push_back(vector1);
    }
    cout<<"==========vector1==============="<<endl;
    for(int i = 0; i<vector1.size();i++)
    {
        cout<<vector1[i]<<endl;
    }
    cout<<"==========vector2==============="<<endl;
    for(int i = 0; i < vector2.size(); i++)
    {
        for(int j = 0; j < vector2[i].size(); j++)
        {
            cout<<vector2[i][j]<<endl;
        }
    }
    }

输出

    ===========vector1================
    1
    2
    3
    4
    5
    6
    7
    8  
    9
    10
    11
    12
    ===========vector2==============
    1
    2
    3
    4
    5
    6
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

我想要

    ===========vector1================
    1
    2
    3
    4
    5
    6
    7
    8  
    9
    10
    11
    12
    ===========vector2==============
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

解决方法

我认为代码没有完全正确粘贴,但从我看来,我认为您在内循环中累积 vector1,将其添加到外循环中的 vector2,但永远不会重新开始对于 vector1(或者是 r?)。您不断追加到 vector1 中,它仍然包含以前的值。

在外循环的顶部添加一个 vector1.clear() 调用。

,

乍一看,您好像忘记在每次迭代前清除 vector1

要清除 vector1,请在此处添加对 clear() 的调用:

    for(int i=0; i<resulvec.size(); i++)
    {
        vector1.clear(); // add call to clear() here
        while ((beg = resultvec[i].find_first_not_of(delims,pos)) != string::npos)
        {
            // omit
        }
            
        beg = 0;
        pos = 0;
        vector2.push_back(vector1);
    }

但这实际上是错误的,现在输出将是:

    ===========vector1================
    7
    8
    9
    10
    11
    12
    ===========vector2==============
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

要获得想要的输出,您应该只将 vector1 推送到 vector2 一次以匹配来自 vector1vector2 的输出。

它会是这样的:

    for(int i=0; i<resulvec.size(); i++)
    {
        while ((beg = resultvec[i].find_first_not_of(delims,pos)) != string::npos)
        {
            // omit
        }
            
        beg = 0;
        pos = 0;
        // move this
        // vector2.push_back(vector1);
    }
    // here
    vector2.push_back(vector1);