3

アルゴリズム lib とベクトル lib を使用して、最初に一連の数値を配列からベクトルにコピーしてから、反復を使用して出力しようとしていますが、コードの問題はどこにありますか?

1 つのことは、最初に vec.begin() を使用してこの反復を行う 2 つの方法を選択したことです。vec.end() メソッド & もう 1 つは (i = 0 ; i < vec.capacity() ; i++) の両方でエラーに直面しています。

私は何をすべきか?

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

using namespace std;

int main()
{
    int intArray[] = {5,6,8,3,40,36,98,29,75};

    vector<int> vecList(9);
    //vector<int>::iterator it;
    copy (intArray, intArray+9,vecList);
    //for(it  = vecList.begin() ; it != vecList.end() ; it++)
    for (int it = 0 ; it < vecList.capacity() ; it++)
    {
        cout<<*it<<endl;
     }

    system("pause");
    return 0;

}
4

5 に答える 5

7

いくつかの改善が可能です。

イテレータとインデックスを混同します。イテレータitはベクトルへの美化されたポインタであり、入力して参照解除する必要があります*it。インデックスiはベクトルの先頭からのオフセットであり、言うvecList[i]とその要素が得られます。

ベクトルの初期化は、配列から読み取るのではなく、初期化子リスト (C++11) を使用して行うのが最適です。

にループする必要がありますvecList.size()。ベクターの容量は、ベクター コンテナーの要素に割り当てられたストレージ スペースのサイズです。Kerrek SBループは、 、またはstd::for_each+ ラムダ式、または通常の for ループで示されるように、範囲指定された for ループで行うのが最適です。it != vecList.end()ただし、その場合は、 ( を使用する代わりに<) を実行し、の代わりにを実行する習慣を身に付けることが最善++itですit++

auto明示的なイテレータ型を書くことも避けていたことに注意してください。auto使えるところならどこでも使い始めるのも良い習慣です。

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

using namespace std;

int main()
{
    // initialize vector with a list of elements
    vector<int> vecList {5,6,8,3,40,36,98,29,75}; 

    // loop from begin() to end() of vector, doing ++it instead of it++ 
    for (auto it = vecList.begin(); it != vecList.end(); ++it) 
    {
        cout<<*it<<endl;
    }

    // the pause command is better done by setting a breakpoint in a debugger

    return 0;

}

Ideoneでの出力(これは g++ 4.5.1 コンパイラを使用します。C++11 機能を利用するには、少なくともそのバージョンにアップグレードすることをお勧めします)。

于 2012-08-16T06:52:14.097 に答える
6

問題は、インデックスとイテレータを混同していることです。

インデックス付き:

 for (int i = 0  ; i < vecList.size() ; it++)
 {
    cout<<vecList[i]<<endl;
 }

イテレータ付き

 for (std::vector<int>::const_iterator it = vecList.begin()  ; i != vecList.end() ; it++)
 {
    cout<<*it<<endl;
 }
于 2012-08-16T06:53:09.020 に答える
1

これは答えではありませんが、最新の C++ を使用すると、詳細に対する多くの脆弱な依存関係をどのように排除できるかを示したいと思いました。

int intArray[] = {5,6,8,3,40,36,98,29,75};

std::vector<int> vecList(std::begin(intArray), std::end(intArray));

for (int i : vecList) { std::cout << i << std::endl; }

イテレータとアルゴリズムを慣用的に使用すると、多くの場合、配列の長さなどの詳細に関する明示的な記述を削除できるため、コードがより堅牢になります。

于 2012-08-16T06:59:15.963 に答える
1

A.ベクトルが自分のために予約しているメモリの量(使用中のメモリの量ではありvecList.size()ません)を反復する必要があります。 B. への呼び出しで整数インデックスをイテレータとして使用しようとした場合、正しい方法について Luchian Grigore の回答を確認する必要があります。vecList.capacity()
it*it

于 2012-08-16T06:58:30.533 に答える
1

タイプミスの使用: copy (intArray, intArray+9,vecList.begin());

それで、

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

using namespace std;


int main()

{

int intArray[] = {5,6,8,3,40,36,98,29,75};

vector<int> vecList(9);
vector<int>:: iterator it;
copy (intArray, intArray+9,vecList.begin());
for (it=vecList.begin();it!=vecList.end(); it++)
{
    cout<<*it<<endl;
 }

system("pause");
return 0;

}
于 2012-08-20T04:43:24.183 に答える