【问题标题】:std::vector and pair in constructor appear to be 'empty'构造函数中的 std::vector 和 pair 似乎是“空的”
【发布时间】:2023-03-18 12:21:01
【问题描述】:

由于某种原因,我的向量和对容器在运行时输出“0”,而不是“输入”的值。这与我声明容器大小的方式有关吗?我也不确定是否正确使用了 emplace_back 函数。

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

class Graph {

    private:
    int n, h, input;
    vector< pair <int,bool> > couple;
    vector <int> vec; 

    public: 
    Graph(vector<int> getVec, int getN, int getH) : vec{move(getVec)}, n(getN), h(getH){  
    vec.resize(n*n);
    couple.resize(n*n);

    for (int i = 0; i < vec.size(); ++i){
        cin >> input;
        vec.push_back(input);
        couple.emplace_back(make_pair(vec[i], false));
        //  cout << vec[i];
        cout << couple[i].first;
    }
};

};

int main() 
{
    int N, H, input;
    cin >> N >> H;
    vector <int> vector;
    Graph g (vector, N, H);
}

【问题讨论】:

  • push_back 附加到向量的末尾。您将向量的大小调整为(错误的)大小,然后附加到该向量的末尾(这显然不会改变第一个 n*n 条目)
  • push_back 表示在容器末尾添加另一个元素。当您调整矢量大小时,元素被初始化为零,这就是您要打印的内容
  • 也不清楚为什么你使用大小n*n而不是n*h,或者为什么你会move(getVec)然后试图覆盖你刚搬进来的东西
  • emplace_back() 用于构造元素并插入它。您已经使用make_pair() 构造了对,因此您可以直接使用push_back() 插入值。您还可以将存储在配对中的值(vec[i]false)传递给 emplace_back(),后者会将它们转发给配对的构造函数,以使用这些值构造配对。
  • 在使用 I/O 时,我发现最好先收集数据,然后调用构造函数。而不是在构造函数中发生 I/O。

标签: c++ stdvector std-pair


【解决方案1】:

在构造函数中试试这个。调整大小后,您不应该使用 push_back,因为向量已经被 vector.resize() 膨胀了。

Graph(vector<int> getVec, int getN, int getH) : vec{ move(getVec) }, n(getN), h(getH){
        vec.resize(n*n);
        couple.resize(n*n);

        for (int i = 0; i < vec.size(); ++i) {
            cin >> input;
            vec.at(i) = input;
            couple.at(i) = make_pair(vec[i], false);
            cout << couple[i].first;
        }
    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多