c++ 为什么我不能像这样插入pair值?v.push_back(vector〈pair〈int,string>>({1,“A”}));?

jrcvhitl  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(116)

我已经编写了这段代码,并希望在vector<vector>中插入一个值,如下所示:

v.push_back(vector<pair<int,string> >({1,"A"}));

但是它显示了一个错误,我想知道为什么这是不可能的。
插入空值的工作原理:

v.push_back(vector<pair<int,string> >({}));

下面是代码:

#include<bits/stdc++.h>
using namespace std;

void printVec(vector<pair<int,string> > &v){
    cout << "Size: " << v.size() << endl;
    for(int i=0; i<v.size(); i++)
    {
        cout << v[i].first << " " << v[i].second << endl;
    }
}

int main()
{
    vector<vector<pair<int,string> > > v;

    int N;
    cin >> N;
    for(int i=0; i<N; i++)
    {
        int n;
        cin >> n;
        v.push_back(vector<pair<int,string> >({}));
        for(int j=0; j<n; j++)
        {
            int x;
            string s;
            cin >> x >>s;
            v[i].push_back({x,s});
        }
    }

    v.push_back(vector<pair<int,string> >({})); // UNABLE TO STORE A PAIR AT THE END. ONLY CAN ADD EMPTY PAIR. DON'T KNOW WHY??
    // v.push_back({}); // USING ANY OF THEM

    for(int i=0; i<v.size(); i++)
    {
        printVec(v[i]);
    }
}
icomxhvb

icomxhvb1#

如果你想用{1,"A"}作为std::initializer_list构造函数的一个元素的初始化器来列表初始化你的向量,你需要使用大括号,而不是圆括号:

vector<pair<int,string>>{{1,"A"}}

或者,如果你不确定如何直接初始化向量中的元素,或者你还没有学过上面的内容,那么只需定义一个变量来临时保存你想推入v的内部向量,将pair元素推入其中,然后使用该变量,这样你就不必猜测任何事情了:

vector<pair<int,string>> inner;
inner.push_back({1,"A"});
 
v.push_back(inner); // alternatively `std::move(inner)` if `inner` is not used later

vector<pair<int,string> >({})可以工作,因为{}参数可以将std::vectorstd::initializer_list-构造函数的std::initializer_list直接初始化为空。最初尝试中的一组附加括号也可以以相同的方式工作,尽管这样括号将是多余的。

mf98qq94

mf98qq942#

这里你推的是一个对子而不是对子的向量。

v.push_back(vector<pair<int,string> >({1,"A"}));

这样做是因为它把({})看作是一个空向量对。

v.push_back(vector<pair<int,string> >({}));`

尽管以下方法有效:

vector<pair<int,string> > temp;
temp.push_back({1, "Hi"});
v.push_back(vector<pair<int,string> >({temp}));

相关问题