関数 ( などmain
) の外側での宣言と初期化は問題ありませんが、関数の外側にコードを含めることはできません。初期化時に (C++11 のように) 値を設定するか、グローバル オブジェクトを main に入力する必要があります。
std::vector<string> Aries;
/* ... */
int main() {
Aries.push_back("Taurus");
/* ... */
}
その他の方法 (メインにベクターを設定せずに)
単一の値
必要のない他の方法.push_back
や、メインの他のコードがあります。たとえば、Aries
アイテムが 1 つだけ含まれる場合は、 と を使用std::vector<T>::vector(size_t s, T t)
できs == 1
ますt == "Taurus"
。
std::vector<string> Aries(1, "Taurus");
/* ... */
int main() { /* ... */ }
同じ値が数回必要な場合は、単純に調整できますs
。
複数の固有値
ここで、これは少しトリッキーになります。vector
適切なコンストラクターを使用して を設定します。std::vector<T>
C++03 では、次の 4 つの異なるコンストラクターが提供されます。
std::vector<T>::vector()
std::vector<T>::vector(size_t, T = T())
template <class InputIt> std::vector<T>::vector(InputIt, InputIt)
std::vector<T>::vector(const vector&)
それらはすべて、実際には追加の最後のパラメーターとしてアロケーターを取りますが、これは私たちの関心事ではないことに注意してください。
std::vector<T>::vector()
ベクトルを値で埋めたいので、については忘れることができます。また、異なる値が必要なstd::vector<T>::vector(size_t, T)
ため、適合しません。残っているのは、テンプレート化されたコンストラクターとコピー コンストラクターです。次の例は、テンプレート化されたコンストラクターの使用方法を示しています。
std::string const values[] = {"Taurus", "Ares", "Testos"};
template <class T, size_t N>
T* begin(T (&array)[N]){ // this is already in C++11, very helpful
return array;
}
template <class T, size_t N>
T* end(T (&array)[N]){
return array+N;
}
std::vector<std::string> Aries(begin(values), end(values));
begin
と は必須ではないことに注意してください。end
単純に を使用できますAries(values, values+3)
。ただし、状況は変化する傾向があり、多くの場合、値を追加したり削除したりします。オフセットを変更するのを忘れると3
、エントリを忘れるか、境界を越えてしまいますvalues
。
ただし、このソリューションは新しいグローバル変数を導入しますが、これはあまり良くありません。一歩後退しましょう。有効な範囲が必要なvalues
を使用したかったので必要でした。std::vector<T>::vector(InputIt, InputIt)
また、コンストラクターを使用するときに範囲がわかっている必要があるため、グローバルである必要があります。呪い!しかし、見てください: ツールボックスにはまだ 1 つのコンストラクター、コピー コンストラクターが含まれています。それを使用するために、追加の関数を作成します。
namespace {
std::vector<std::string> initializer(){
const std::string dummy_array[] = {"Taurus", "Ares", "Testos"};
return std::vector<std::string>(begin(dummy_array), end(dummy_array));
}
}
std::vector<std::string> Aries(initializer());
この例では、コピー コンストラクターと範囲コンストラクターの両方を使用しています。一時的なベクトルを作成し、std::vector<T>::push_back
それを関数に取り込むために使用することもできます。