声明向量<vector <pair <int,int =“”>&gt;具有特定的大小和插入元素?

时间:2016-05-11 19:03:23

标签: c++ vector data-structures stl graph-theory

我想表示图形数据结构,我在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个零,然后是推送的值。有办法解决这个问题吗?

3 个答案:

答案 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));
}