【问题标题】:Using push_back for vector<vector<string>> correctly with a for & while loop in C++?在 C++ 中使用 for & while 循环正确使用 push_back for vector<vector<string>>?
【发布时间】:2021-06-16 00:53:07
【问题描述】:

基本上我有字符串形式的图像坐标。我有这两个字符串的向量,并且我正在使用一些分隔符对其进行解析。解析正在正确完成,并且第一个 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

【问题讨论】:

  • result2 在没有声明的情况下使用。请发帖Minimal, Reproducible Example
  • 当您使用调试器运行此程序时,一次运行一行,并监控所有这些变量和向量中的内容,以及在执行程序的每一行后它们如何变化(如报告您的调试器)您看到了什么,预期结果何时开始与您的预期结果不同?
  • resulvecr 也可以在没有声明的情况下使用。
  • 您是否在发布问题时匆忙输入代码?您应该退后一步,确保您实际发布的最终代码能够编译并产生您声称的结果,而不是尝试进行在线实时编辑。
  • 你应该在循环之后移动vector2.push_back(vector1);,让它只执行一次。否则,vector2 将有多个元素,这会使vector1vector2 的内容不同,因为打印vector2 意味着至少打印vector1 的所有元素。

标签: c++ string parsing vector delimiter


【解决方案1】:

乍一看,您似乎忘记在每次迭代之前清除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);

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 好的,那么我的阅读是正确的。 vector2 将包含不断增长的 vector1 的连续快照。
    • 嗯还有 1 件事。现在vector1输出总是789101112。虽然现在我不需要vector1但仍然知道如何纠正它?
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多