为何无法通过v.push_back(vector<pair<int,string>>({1,"A"}))插入pair元素?
问题原因
- 你尝试用
vector<pair<int,string>>({1,"A"})创建子vector时,初始化列表里的1,"A"是两个独立的基础类型值(int和string),但目标vector的元素类型是pair<int,string>,编译器无法自动将这两个单独的值组合成一个pair对象来匹配vector的元素要求,因此会触发编译错误。 - 而
vector<pair<int,string>>({})是合法的,因为空初始化列表会直接构造一个空的vector,完全符合vector的默认构造规则。
解决方案
以下几种写法都能正确创建包含单个pair元素的子vector并插入到容器v中:
显式构造pair作为vector的元素
给pair套一层大括号,让编译器识别这是一个pair类型的元素:v.push_back(vector<pair<int,string>>({{1,"A"}}));或者用
make_pair显式生成pair对象:v.push_back(vector<pair<int,string>>({make_pair(1,"A")}));使用emplace_back简化写法
利用emplace_back直接在容器内构造子vector,省略外层的vector显式构造:v.emplace_back({{1,"A"}});分步创建子vector再插入
先单独创建子vector并添加元素,再插入到外层容器:vector<pair<int,string>> sub_vec; sub_vec.emplace_back(1, "A"); // 或者 sub_vec.push_back({1,"A"}); v.push_back(sub_vec);
修改后的完整代码示例
#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>>({{1,"A"}})); for(int i=0; i<v.size(); i++) { printVec(v[i]); } }
内容的提问来源于stack exchange,提问作者Amar Naskar
相关产品推荐
相关产品推荐

