Не могу понять, почему мне не дают подписать этот вектор - PullRequest
2 голосов
/ 11 февраля 2011

Код, который я пытаюсь запустить:

std::string genBlankName(std::vector<Post> &posts)
{
    std::string baseName = "New Post ";
    int postNum = 1;

    for (std::vector<Post>::iterator currentPost = posts.begin(); currentPost != posts.end(); currentPost++)
    {
        if (posts[currentPost].name.substr(0, baseName.length()) == baseName &&
            utils::is_num(posts[currentPost].name.substr(baseName.length(), std::string::npos)) &&
            utils::to_int(posts[currentPost].name.substr(baseName.length(), std::string::npos)) > postNum)
        {
            postNum = utils::to_int(posts[currentPost].name.substr(baseName.length(), std::string::npos));
        }
    }

    return baseName + utils::to_string(postNum);
}

И получаю ошибку:

/ home / brett / projects / CLPoster / CLPoster-build-desktop /../ CLPoster / item.h: 240: ошибка: не соответствует функция для вызова std::vector<cl::Post, std::allocator<cl::Post> >::at(__gnu_cxx::__normal_iterator<cl::Post*, std::vector<cl::Post, std::allocator<cl::Post> > >&)

Извините, что не сказал больше, но я предполагаю, что это довольно распространенная вещь, я просто не подозреваю о том, чтобы быть кусочком. Я бы попробовал Google, но это кажется слишком общей проблемой, чтобы найти что-то полезное, так как я подозреваю, что это скорее проблема с моей реализацией или что-то в этом роде.

Ответы [ 4 ]

9 голосов
/ 11 февраля 2011

Подписка требует использования индекса, вы используете итераторы.

Вам вообще не нужен индекс, просто разыменуйте ваш итератор:

currentPost->name.substr(0, baseName.length())

… и так далее.

6 голосов
/ 11 февраля 2011

Вы не используете итераторы на подписках.Просто возьмите size_t

for (size_t currentPost = 0; currentPost < posts.size(); ++currentPost)

или разыщите итератор:

currentPost->name.substr(0, baseName.length())
1 голос
/ 11 февраля 2011

векторный оператор [] принимает size_type в качестве параметра, а не std::vector::iterator тип.

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

std::vector<typename T> является контейнером произвольного доступа, однако вам необходимо использовать смещение для доступа к элементам в заданных позициях. Например, если вы хотите получить элемент номер пять, вы пишете что-то вроде:

std::vector<int> data;
data[5] = 10;

Но в вашем примере вы используете итератор. Думайте об итераторе как о указателе на ваш Post объект. Вы не можете использовать этот указатель в качестве индекса элемента в вашем векторе. Поэтому ваш код должен выглядеть следующим образом:

std::string genBlankName (std::vector<Post> &posts)
{
    std::string baseName = "New Post ";
    int postNum = 1;

    for (std::vector<Post>::iterator currentPost = posts.begin();
         currentPost != posts.end(); currentPost++)
    {
        if (currentPost->name.substr(0, baseName.length()) == baseName &&
            utils::is_num(currentPost->name.substr(baseName.length(), std::string::npos)) &&
            utils::to_int(currentPost->name.substr(baseName.length(), std::string::npos)) > postNum)
        {
            postNum = utils::to_int(currentPost->name.substr(baseName.length(), std::string::npos));
        }
    }

    return baseName + utils::to_string(postNum);
}

Или вы можете использовать индексы, но тогда вы не можете использовать итераторы, например:

std::string genBlankName (std::vector<Post> &posts)
{
    std::string baseName = "New Post ";
    int postNum = 1;

    for (size_t currentPost = 0; currentPost < posts.size (); ++currentPost)
    {
        if (posts[currentPost].name.substr(0, baseName.length()) == baseName &&
            utils::is_num(posts[currentPost].name.substr(baseName.length(), std::string::npos)) &&
            utils::to_int(posts[currentPost].name.substr(baseName.length(), std::string::npos)) > postNum)
        {
            postNum = utils::to_int(posts[currentPost].name.substr(baseName.length(), std::string::npos));
        }
    }

    return baseName + utils::to_string(postNum);
}

Надеюсь, это поможет. Удачного кодирования!

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