2011-12-27 9 views
-3

私のアルゴリズムのために、いくつかの空白(NULL)ノードをベクターに挿入する必要があります。C++ Stlベクトルは空(NULL)ノードを挿入します

私は

array.push_back(NULL); 

ようにしようとした。しかし、それは0の値でノードを追加します。

編集:

私は私が望むすべてのラウンド[10000] int型と私はいくつかのギャップを残したい私のvector.Soにいくつかのギャップを残して、ベクターsirali_diziに挿入したが、これと同様の整数配列から値を取得私の配列をソートするために私が使用することはできません-1またはあなたのベクトルは、その後、NULLポインタの集合体である場合は0等

NULLであるためだ
+1

array' 'の種類は何ですが? – Cameron

+1

ソートする値を持つ配列です。 – droidmachine

+2

正確な型はC++では重要です。配列の宣言をあなたに追加してください。 –

答えて

-6

あなたの代わりにint型のint型へのポインタのベクトルを作ることができる

vector<int*>::iterator iIter; 
for(iIter = vInt.begin(); iIter != vInt.end(); iIter++){ 
    if(*iIter != NULL){ 
     // Notice the double asterisk: it's a pointer (the iterator) to another pointer (the value) 
     cout << **iIter << endl; 
    } 
} 
+0

もし私がvInt.push_back(21)をしたら;それはアドレス21ではない値ですか? – droidmachine

+0

いいえ、21がアドレスになります。あなたはこれを行う必要がありますvInt.push_back(新しいint(21));あなたがそれを使用し終えたら、メモリを解放することを忘れないでください。 – Rellikiox

+3

-1:このような逆参照を主張する無効な構文の回答は受け付けません。 @droidmachineあなたはあなたの質問を明確にし、より良い答えを得るためのより完全なコード例を示す必要があります。 – AJG85

4

#define dが0

をするalso.So(0)常に不正なポインタ値であり、偽陽性を心配することなく安全に検査することができます。

あなたの配列が0である整数の場合、他のセンチネル値を使って区別する必要があります。 NULLはポインタで使用することを意図しています。

+0

を使用したいと思うかもしれません。 –

+0

@Gtoknu:正確に – Cameron

+0

しかし、私のベクトルはsort.Soに値を持っています。私は-1のような値を使うことはできません。私はこのベクトルの値を使うことができますか? – droidmachine

2

NULLを使用して空のノードを検出することは必須ではありません。

「0」の値を使用しない場合や、-1などの他の値を使用する場合は、INFなどを使用して、空のノードに注意することができます。その後、

vector<int*> vInt; 
vInt.push_back(NULL); 

と値をこのようにアクセスします:

0

NULL値がある場合は、この情報をカプセル化できる型が必要です。
ここで、メモは無効または有効(値付き)です。

class Node 
{ 
    bool valid; 
    int value; 

    public: 
    Node(int v): valid(true), value(v) {} 
    Node():  valid(false)   {} 

    bool isValid() const {return valid;} 

    Node& operator=(int newValue) 
    { 
     valid = true; 
     value = newValue; 
     return *this; 
    } 
    void makeInvalid() 
    { 
     valid = false; 
    } 
    bool operator<(Node const& rhs) const 
    { 
     // If both are invalid then neither is less. 
     // If one is invalid the invalid one is less 
     // Otherwise use the value to sort by 

     if (!valid && !rhs.value)  { return false;} 
     if (valid && !rhs.valid)  { return false;} 
     if (!valid && rhs.valid)  { return true;} 
     return value < rhs.valid; 
    } 
    friend std::ostream& operator<<(std::ostream& stream, Node const& value) 
    { 
     if (value.isValid()) 
     { stream << value.value; 
     } 
     else 
     { stream << "-- NULL --"; 
     } 
     return stream; 
    } 
}; 

その後あなたがこの使用することができます。

#include <algorithm> 
#include <vector> 
#include <iterator> 
#include <iostream> 

int main() 
{ 
    std::vector<Node> data; 

    data.push_back(1); 
    data.push_back(2); 
    data.push_back(Node()); // Invalid or NULL value. 

    std::sort(data.begin(), data.end()); 
    std::copy(data.begin(), data.end(), 
       std::ostream_iterator<Node>(std::cout, " ") 
      ); 
} 

は、その後、あなたが得るランニング:

> g++ sort.cpp 
> ./a.out 
-- NULL -- 1 2 
関連する問題