std :: vector.size () не работает - PullRequest
       13

std :: vector.size () не работает

1 голос
/ 26 февраля 2011

У меня есть некоторый код, включающий несколько векторов, но он не дает мне размер вектора:

using namespace std;

struct key_stat{
    string USER, url;
    float click_count, post_count, click_cost, post_cost;
    keyword_stat(): USER("") {}
};

class key
{
    private:
    string word;
    vector <key_stat> stats;
public:
    key(string & kw);
    vector <key_stat> get_stats(){return stats;}

};


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void search(string & word, vector <key> & keys){
    unsigned int x;
    // getting the x value
    for (x = 0; x < keys.size(); x++){
        if (keys[x].get_word() == word)
            break;
    }
    vector <keyword_stat> t = keys[x].get_stats();
    t.size()
}

Это не работает:

t.size(); 

Есть ли причина, почему?

1 Ответ

3 голосов
/ 26 февраля 2011

вектор operator[] не выполняет проверку границ. Итак, вот что происходит:

for (x = 0; x < keywords.size(); x++){
    if (keywords[x].get_word() == word)
        break;
}

, если это не находит ваш word в векторе ключевых слов, x будет размером ключевых слов.

vector <keyword_stat> t = keywords[x].get_stats();

штука за раз: keywords[x] теперь читает за пределами вектора, возвращая мусор. .get_stats() пытается вернуть вектор, но просто получает больше мусора.

t.size();

Теперь вы вызываете функцию для поврежденных данных.

Чтобы исправить это, проверьте x < keywords.size(), прежде чем использовать его в vector::operator[] - или просто используйте vector::at(), который выполняет проверку границ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...