【问题标题】:How can I make pair using vector in c++? [closed]如何在 C++ 中使用向量进行配对? [关闭]
【发布时间】:2020-10-30 21:54:59
【问题描述】:

我很难将两个整数作为一对向量推入。我想知道哪里出错了。谢谢!

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    vector <pair<int,int>> vec;
    int s,n; cin>>s>>n;

    for(int i=0;i<n;i++){
        int in1,in2; cin>>in1>>in2;
        vec[i].push_back(make_pair(in1,in2));
    }
    sort(vec.begin(),vec.end());

    int checker=1;
    for(int i=0;i<n;i++){
        if(s<=vec[i].first){
            checker=0;
            break;
        }
        else{
            s+=vec[i].second;
        }
    }
    if(checker>0)cout<<"YES"<<endl;
    else if(checker==0)cout<<"NO"<<endl;
    return 0;
}

【问题讨论】:

  • 您是否收到编译器错误?请在问题中包含它
  • 你是说vec.push_back(make_pair(in1,in2));吗?
  • @Kamiccolo 我添加了 [i] 来指定索引,但这里有问题吗?
  • vec[i] 是一对,但您想推入向量而不是一对。在添加一个之前,索引i 处也没有元素
  • 是的,我已经理解了这里的问题。我的代码现在可以工作了。谢谢!

标签: c++ c++11 vector stdvector


【解决方案1】:

为了避免对std::pair 进行不必要的复制,您可能需要使用std::vector::emplace_back 就地构造std::pair

vec.emplace_back(in1, in2);

【讨论】:

  • 我不太明白。我将不得不更多地研究它。
  • @FahimHassan 在使用vec.push_back(make_pair(in1, in2)); 时,正在使用make_pair(in1, in2) 创建一个对象。然后将此对象复制到std::vector。使用emplace_back,可以避免此副本,因此您最终会获得更好的性能。查看更多here
  • 这太棒了。谢谢!
【解决方案2】:

在向量中推入值的正确语法是:vectorname.push_back(value)

所以, 你需要写vec.push_back(make_pair(in1,in2)); 而不是

vec[i].push_back(make_pair(in1,in2)).

如果您需要在特定索引处插入对,那么您将不得不使用insert 函数而不是push_back,因为push_back 将元素插入到向量的结尾。

插入第 i 个索引请使用:

vec.insert(vec.begin() + i, make_pair(int1, int2)).

【讨论】:

  • 是的,我已经理解了这里的问题。我的代码现在可以工作了。谢谢!
【解决方案3】:

变化:

vec[i].push_back(make_pair(in1, in2));

vec.push_back(make_pair(in1, in2));

另外,如果你改变这两行的顺序:

    vector <pair<int,int>> vec;
    int s,n; cin>>s>>n;

并保留向量的size,您不必每次执行push_back 时都重新分配内存。这将使您的程序更有效率:

    int s,n; cin>>s>>n;
    //preallocate for 'n' elements
    vector <pair<int,int>> vec;
    vec.reserve(n);

【讨论】:

  • 是的,我已经理解了这里的问题。我的代码现在可以工作了。谢谢!
  • 值得一提的是,您不能将第二个建议与第一个建议结合使用。如果要继续使用push_back,则需要使用reserve();如果使用n 元素创建向量,则需要使用operator[]
  • @Yksisarvinen 确实如此。我更新为使用reserve(),因为它更简单、更直接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多