我想表示图形数据结构,我在c ++ stl中使用对向量的向量。例如:
#!/usr/bin/php
<?php
$DB_USER="";
$DB_PASS="";
$DB_TNS="";
$contents="";
$formattedDate=date('m_d_y',strtotime("-1 days"));
$fileName="testDump";
if($conn = oci_connect($DB_USER, $DB_PASS, $DB_TNS))
{
$sql = 'SELECT
drw.PROD_CODE delID
FROM
CIRC_RPT.VW_SUBS_DRW drw
JOIN CIRC.SUBSCRIPTION csub on csub.ACCOUNT = drw.account
where delivery_pub in (1,32) and drw.account = 47059092';
$stid = oci_parse($conn, $sql);
oci_define_by_name($stid, 'delID', $delvID);
oci_execute($stid);
$handle = fopen("/usr/local/bin/next/FILES/".$fileName.".csv", "w");
fwrite($handle, "First Name,Last Name,Email,Phone,HouseNumber,DeliveryScheduleId\n");
while (OCIFetch($stid)){
$contents.=$delvID.",";
echo "delvID=".$delvID;
$contents="";
}
fclose($handle);
oci_close($conn);
}
else
{
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
?>
现在我可以做,vector<vector<pair<int, int>>> G;
问题:我需要指定这个数据结构的大小。如果我不这样做,当我尝试将元素推送到此数据结构时,我会遇到分段错误。如果我给的大小如下:
G[u].push_back(make_pair(v, w));
现在的问题是前10对向量被初始化为零。如果我现在推回一个元素,它会被推到第11个位置。前10个是0。我不想这样做。我想按照我需要的顺序插入元素。一个片段,让您了解我想要做的事情:
vector< vector<ii> > adj(10, std::vector<ii>(10));
上面的输出将是10个零,然后是推送的值。有办法解决这个问题吗?
答案 0 :(得分:1)
不知何故,你自相矛盾:创建一个向量时,你既可以传递构造函数中的元素数量,也可以从一个空向量开始,然后在向量中推送你想要的元素。如果你从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);
}
}
答案 1 :(得分:0)
如果您事先知道数据结构大小,可以使用正确的构造函数声明它:
vector<vector<pair<int,int>>> G(10);
当程序正在读取数据以填充该结构时,它可以检查输入的indeces是否超出界限或相应地调整向量的大小。例如,这个测试程序:
#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
答案 2 :(得分:-1)
分段错误是因为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));
}