无法理解为什么我不被允许下标这个载体

时间:2011-02-11 14:19:11

标签: c++ vector

我正在尝试运行的代码:

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> > >&)

很抱歉没有多说,但我认为这是一个很常见的事情,我只是不知道自己是一个小组。我会谷歌它,但似乎太普遍的问题,因为我怀疑它更多的是我的实现的问题或其他一些问题。

4 个答案:

答案 0 :(得分:9)

订阅需要使用索引,您正在使用迭代器。

根本不需要下标,只需取消引用迭代器:

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

......等等。

答案 1 :(得分:6)

您不在下标上使用迭代器。只需要size_t

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

或取消引用迭代器:

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

答案 2 :(得分:1)

std::vector<typename T>是一个随机访问容器,但是,您必须使用offset来访问给定位置的元素。例如,如果要获取元素编号5,则可以编写如下内容:

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);
}

希望它有所帮助。快乐的编码!

答案 3 :(得分:1)

vector operator[]size_type作为参数,而不是std::vector::iterator类型。