2

私は C++/一般的なプログラミングを学んでおり、古い標準用に書かれた演習を行いながら C++11 の機能を試すこともあります。

この演習には、文字列へのポインターのベクトルが含まれます。

#include <vector>
#include <string>
#include <iostream>
int main()
{
    using std::string ;
    using std::vector ;
    using std::cout ;
    using std::endl ;

    vector<string *> v = {new string("Hello") , new string("World")} ;
    for (string * x : v) {
        cout << *x << " " ;
        delete x ;
    }
    cout << endl ;
}

このベクトルで初期化リストを使用する方法を理解するのに少し苦労しましたが、これはうまくいくようです。

このバージョンも動作します:

    //...
    string s1 = "Hello" ;
    string s2 = "World" ;
    vector<string *> v = {&s1 , &s2} ;
    for (string * x : v)
        cout << *x << " " ;
    //...

それはよりきれいに見え、これまでに学んだことから、より良い解決策のようです.

しかし、私は疑問に思っています:事前に文字列を作成したり、削除を使用したりせずにベクトルを初期化する方法は他にありますか? 私が読んだことによると、{} リストは普遍的に使用できるはずです。

そして、それが価値があるために、これはかなり壊滅的なエラーを引き起こします:

vector<string *> v = {"Hello" , "World"} ;
4

3 に答える 3

12

std::string*そもそもなんで使うの?その理由はありますか?私はそうは思わない。

これを使って:

std::vector<std::string> v{"Hello" , "World"};

を使用する必要はありませんnew。このようなクラスは、自分で使用することを避けることができるため、正確に設計されていnewます。

また、上記の初期化には'='between'v'とinがないことに注意してください。'{'この初期化は、C++11 で導入された一様初期化と呼ばれます。その他の例はこちら.

于 2012-05-27T08:09:47.257 に答える
3

しかし、私は疑問に思っています.事前に文字列を作成したり、削除を使用したりせずにベクトルを初期化する方法は他にありますか?

いいえ、何かへのポインターを保存するには、この何かを別の場所に保存する必要があります。そうしないと、ポインターが指す場所がなくなります。

奇妙に感じるのは、おそらく、これ文字列を格納する通常とは異なる方法だからです。それが(人為的な)エクササイズでなければ、 を使用しstd::vector<std::string>> て問題を取り除くことができます。

于 2012-05-27T08:32:35.260 に答える
0

Nawaz が言ったように、なぜわざわざ文字列へのポインターを使用するのでしょうか? -> 演算子を使用するためだけに?いくつかのプライベート変数を持つクラスを作成し、参照を使用してそれらを返します。これは、矢印演算子を使用する場合のより良い例です。

于 2012-05-27T08:34:39.573 に答える