web-dev-qa-db-ja.com

ループ内の空のベクターに要素を追加するにはどうすればよいですか?

ループ内で空のベクターを作成しようとしていますが、そのループに何かが読み込まれるたびにベクターに要素を追加したいと思います。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
   std::vector<float> myVector();

   float x;
   while(cin >> x)
      myVector.insert(x);

   return 0;
}

しかし、これは私にエラーメッセージを与えています。

28
Amber Roxanna

代わりに std::vector::Push_back() を使用する必要があります。

_while(cin >> x)
  myVector.Push_back(x);
//         ^^^^^^^^^
_

std::vector::insert() ではなく、リンクからわかるように、要素を挿入する位置を示すイテレータが必要です。

また、 @ Joelがコメントしたもの のように、ベクトル変数の定義の括弧を削除する必要があります。

_std::vector<float> myVector;
_

およびnot

_std::vector<float> myVector();
_

後者を実行すると、C++の Most Vexing Parse の問題が発生します。

29
Mark Garcia

つかいます - Push_back

while(cin >> x)
  myVector.Push_back(x);

insert 関数は、挿入する位置を示すイテレータを最初の引数として受け取ります。

また、myVectorの宣言内の括弧を削除する必要があります。

std::vector<float> myVector;
3
Yang

myVector.insert()を使用する場合は、myVector.insert(myVector.end(), x)のように使用します。これにより、myVectorの最後にxが追加されます。 myVector.insert(myVector.begin(), x)でxを先頭に挿入できます。

2
Nikunj

別のオプションは、std::vector::emplace_back()の代わりにstd::vector::Push_back()を使用することです。はいくつかの最適化を行い、vector::value_type型の引数を取りません。追加の項目のコンストラクターに転送される可変引数を取りますが、Push_backは不要なコピーまたは移動を行うことができます。

これは std :: vector :: emplace_back ドキュメンテーションで実証されており、 here は関連する質問です。

使用例:

std::vector<int> myVector;

while (cin >> x) {
    myVector.emplace_back(x);
}
1
J-Alex