声明具有特定大小的 vector<vector<pair<int、int>>?
Declaring a vector<vector<pair<int, int>> with a specific size and inserting elements?
我想表示一个图形数据结构,我使用的是c++stl中成对向量的向量。示例:
vector<vector<pair<int, int>>> G;
现在我可以了,G[u].push_back(make_pair(v, w));
问题是:我需要为这个数据结构指定一个大小。如果我不这样做,当我试图将元素推送到这个数据结构时,我会遇到分段错误。如果我给出的尺寸是:
vector< vector<ii> > adj(10, std::vector<ii>(10));
现在的问题是前10对矢量被初始化为零。如果我现在推回一个元素,它就会被推到第11个位置。前10个是0。我不想这么做。我想按需要的顺序插入元素。一个片段,让你知道我正在尝试做什么:
for(int i=0;i<E-1;i++)
{
cin >> p >> q >> l;
adj[p].push_back(ii(q, l));
adj[q].push_back(ii(p, l));
}
上面的输出将是10个零,后面跟着推送的值。有办法绕过这个吗?
不知何故,你在自相矛盾:创建向量时,你可以在构造函数中传递元素的数量,也可以从一个空向量开始,推送你想要在向量中包含的元素。如果你从10号开始,然后再推10号,就有20号。他们要么使用
std::vector<T> vect(10);
for (size_t i=0;i<10;i++){
vect[i] = whatever;
}
或
std::vector<T> vect;
for (size_t i=0;i<10;i++){
vect.push_back(whatever);
}
也许你混淆了向量的大小和它的容量。您可以通过以下方式进行设置:
std::vector<T> vect;
vect.reserve(10);
for (size_t i=0;i<10;i++){
vect.push_back(whatever);
}
对于向量中的向量,在开始将元素推入索引之前,必须确保在该索引处有一个向量:
std::vector<std::vector<T>> mat;
for (size_t i=0;i<10;i++){
mat.push_back(std::vector<T>());
for (size_t j=0;j<10;j++){
mat[i].push_back(whatever);
}
}
如果您事先知道数据结构的大小,您可以使用适当的构造函数声明它:
vector<vector<pair<int,int>>> G(10);
当程序读取数据以填充该结构时,它可以检查输入的indes是否越界,也可以相应地调整向量的大小。例如这个测试程序:
#include <iostream>
#include <vector>
using std::vector;
using std::pair;
using std::cout;
using std::cin;
int main() {
vector<vector<pair<int,int>>> G(5);
// insufficient initial size ^^^
int p, q, l;
while ( cin >> p >> q >> l )
{
// resize the vector to avoid index out of bound
int m = std::max(p, q) + 1;
if ( m > G.size() )
G.resize(m);
G[p].push_back(std::make_pair(q, l));
G[q].push_back(std::make_pair(p, l));
}
for( int r = 0; r < G.size(); ++r )
{
for ( int c = 0; c < G[r].size(); ++c ) {
cout << r << ", " << c << ": " << G[r][c].first << ' ' << G[r][c].second << 'n';
}
}
return 0;
}
输入类似:
1 2 3
4 5 6
7 8 9
8 7 6
5 4 3
2 1 0
给出以下输出:
1, 0: 2 3
1, 1: 2 0
2, 0: 1 3
2, 1: 1 0
4, 0: 5 6
4, 1: 5 3
5, 0: 4 6
5, 1: 4 3
7, 0: 8 9
7, 1: 8 6
8, 0: 7 9
8, 1: 7 6
分段错误是因为u >= G.size()
,而不是由push_back()引起的。
您需要首先将G的大小调整为图形的顶点数量,然后,只要u < G.size()
,您就可以进行推回
更正后的代码应该是这样的:
vector< vector<ii> > adj(10 /* number of vertexes in the graph */);
for (int i=0; i < E-1; i++)
{
cin >> p >> q >> l;
// make sure both p < adj.size() and q < adj.size()
adj[p].push_back(ii(q, l));
adj[q].push_back(ii(p, l));
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 呼叫运营商<<临时
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 运营商&lt;&lt;无法访问班级的私人int
- std::pair的默认构造函数<>将基本类型(int等)设置为零
- 如何显示/打印字符串对象?cout & lt; & lt;Int工作,count <<字符串