3

私は C++ を初めて使用し、ベクトルを扱う際に問題に直面しました。

別のクラスから「GridClass」で宣言されたベクターにアクセスする必要があるため、ベクターを public として宣言し、それを設定しようとしました。これが私のコードです。

GridClass.h

#include <vector>

class GridClass : public CDialog
{
    DECLARE_DYNAMIC(GridClass)

public:
    GridClass(CWnd* pParent = NULL);   // standard constructor
    virtual ~GridClass();

protected:
    int nItem, nSubItem;

public:
    std::vector<CString> str; // <--The vector

GridClass.cpp;

str.reserve(20);//This value is dynamic
for(int i=0;i<10;i++){
    str[i] = GetItemText(hwnd1,i ,1);// <-- The error occurs here
}

サイズが動的であるため、配列を使用できません。デバッグには 20 しか使用しませんでした。ここで何が間違っていますか?

4

2 に答える 2

6

std::vector::reserveはベクターの容量を増やすだけで、要素を割り当てません。これは、ベクターが空であることを意味します。str.size()この場合、std::vector::resizeが必要です。0

str.resize(20);

または、電話するだけstd::vector::push_back

str.reserve(20);   // reserve some space which is good. It avoids reallocation when capacity exceeds
for(int i=0; i<10; i++){
    str.push_back(GetItemText(hwnd1,i ,1)); // push_back does work for you.
}
于 2013-10-04T10:25:35.500 に答える
4

を呼び出した後、ベクトルはまだ空reserveです。insertまたは で文字列を追加するかpush_back、 で空の文字列を追加する必要がありますresize

ループを使用して 10 個の文字列を入力するには、次を使用しますpush_back

for(int i=0;i<10;i++){
    str.push_back(GetItemText(hwnd1,i ,1));
}

または、20 個の文字列が必要な場合、最初の 10 個を割り当てて残りを空のままにしておくと、ループを維持できますがresizereserve.

于 2013-10-04T10:28:18.720 に答える