标签: const-iterator

如何实现const_auto,因为C++ 11缺少它?

autoC++ 11 的类型很方便,所以现在也想要一个const_auto类型.例如,假设std::list<T> a;,如果

auto p = a.begin();
Run Code Online (Sandbox Code Playgroud)

有类型std::list<T>::iterator,然后有人希望

const_auto p = a.begin();
Run Code Online (Sandbox Code Playgroud)

有类型std::list<T>::const_iterator.不幸的是,C++ 11似乎没有听说过const_auto.因此,如何才能以良好的风格达到理想的效果呢?

(有关信息,请在此处提出并回答相关问题.)

c++ const-iterator auto c++11

3
推荐指数
1
解决办法
231
查看次数

STL const_iterator强制转换 - 编译器差异

我正在将一大块代码从gcc移植到Visual Studio 2013.以下代码示例在gcc 4.4上工作正常(!),但在VS2013上编译begin()end()失败:

错误C2440:'':无法从'unsigned char*'转换为'std :: _ Vector_const_iterator >>'

class foo {
    unsigned char* value;
    int length;

    std::vector<unsigned char>::const_iterator begin();
    std::vector<unsigned char>::const_iterator end();
};

std::vector<unsigned char>::const_iterator foo::begin() {
    return std::vector<unsigned char>::const_iterator(value);
}

std::vector<unsigned char>::const_iterator foo::end() {
    return std::vector<unsigned char>::const_iterator(value + length);
}
Run Code Online (Sandbox Code Playgroud)

鉴于我不想重写整个事物,是否有可行的方法来创建这些const_iterators?

c++ gcc stl const-iterator visual-studio-2013

3
推荐指数
1
解决办法
461
查看次数

迭代对的向量

我写了下面的代码片段,但它似乎没有工作.

int main(){
    int VCount, v1, v2;
    pair<float, pair<int,int> > edge;
    vector< pair<float, pair<int,int> > > edges;
    float w;
    cin >> VCount;
    while( cin >> v1 ){
        cin >> v2 >> w;
        edge.first = w;
        edge.second.first = v1;
        edge.second.second = v2;
        edges.push_back(edge);
    }
    sort(edges.begin(), edges.end());
    for ( vector < pair<float,pair<int,int>> >::const_iterator it = edges.begin() ; itt != edges.end; it++){
        cout >> it.first;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它在包含for循环的行中抛出错误.错误是:

error: no match for ‘operator<’ in ‘it < edges.std::vector<_Tp, _Alloc>::end [with _Tp = …
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl vector const-iterator

3
推荐指数
2
解决办法
3万
查看次数

向量中cbegin和cend的使用

我想观察cbegin和begin之间的区别。

但是当我使用cbegin时,我得到的结果与开始相同。根据定义,cbegin将返回const itertaor,我们无法使用cbegin返回的const iterator修改元素。但是,我仍然能够擦除特定位置的元素。

    for (auto i = g1.cbegin(); i != g1.cend(); ++i){             
            cout << *i << " ";
    }
    //below code erases element at const pointer
    g1.erase(i);
Run Code Online (Sandbox Code Playgroud)

c++ iterator vector erase const-iterator

3
推荐指数
1
解决办法
82
查看次数

将 const_iterator 分配给迭代器

我有以下代码片段(您可以在此处运行:http://coliru.stacked-crooked.com/a/2f62134b5c125051

#include <iostream>
#include <set>
#include <map>

int main() 
{
    std::set<std::pair<const int, const int>> const mySet{{0,0}}; // value_type = std::pair<const int, const int>
    for (std::set<std::pair<const int, const int>>::iterator it  = mySet.cbegin(); it != mySet.cend(); ++it)
    {
        std::cout<<"set it = " << it->first << " " << it->second << std::endl;
    }

    std::map<const int, const int> const myMap{{0,0}}; // value_type = std::pair<const int, const int>
    for (std::map<const int, const int>::iterator it  = myMap.cbegin(); it != myMap.cend(); ++it)
    {
        std::cout<<"map it …
Run Code Online (Sandbox Code Playgroud)

c++ iterator set const-iterator c++11

3
推荐指数
1
解决办法
1412
查看次数

无法将“this”指针从“const Bullet”转换为“Bullet &amp;”

我正在尝试使用我的项目符号列表。每当我运行更新项目符号代码时,它都会出现以下错误:

错误 1 ​​错误 C2662:“Bullet::detectCollision”:无法将“this”指针从“const Bullet”转换为“Bullet &”

我的列表:

std::list<Bullet> bullet_list;
Run Code Online (Sandbox Code Playgroud)

我的更新代码:

std::list<Bullet>::const_iterator cIter;
    for ( cIter = bullet_list.begin( ); cIter != bullet_list.end( ); cIter++ )
    {
        if((*cIter).detectCollision(monster.position,monster.getHeight(),monster.getWidth()))
        {
//Do stuff here
        }
        if ((*cIter).detectCollision(boss.getPosition(),boss.getHeight(),boss.getWidth()))
        {
//Do stuff here
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的检测碰撞代码:

bool Bullet::detectCollision(Vector objTwo,int heightT,int widthT)
{
if(position.getVectorX() >= objTwo.getVectorX() - (widthT/2) && position.getVectorX() <= objTwo.getVectorX() + (widthT/2)
    && position.getVectorY() >= objTwo.getVectorY() - (widthT/2)&& position.getVectorY() <= objTwo.getVectorY() + (heightT/2) && alive)
{
    return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator list const-iterator

2
推荐指数
1
解决办法
1312
查看次数

"不匹配运算符 - "简单迭代器差异的错误

这是我的代码:

#include <set>
#include <iostream>
using namespace std;

int main(){
    set<int> st;
    st.insert(1);
    int x = st.find(1) - st.begin();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我到了error: no match for 'operator-' in 'st.std::set<_Key, _Compare, _Alloc>::find [with _Key = int, _Compare = std::less<int>, _Alloc = std::allocator<int>](((const int&)((const int*)(&1)))) - st.std::set<_Key, _Compare, _Alloc>::begin [with _Key = int, _Compare = std::less<int>, _Alloc = std::allocator<int>]()'.

我无法弄清楚迭代器差异是如何突然停止工作的!我在这里错过了什么吗?

c++ iterator const-iterator c++11 c++14

1
推荐指数
2
解决办法
1396
查看次数

c ++中迭代器的const向量

如果我有一个包含另一个向量的迭代器的向量.

例如 :

vector<vector<int>::iterator> vec;
Run Code Online (Sandbox Code Playgroud)

在const refrence中传递这个向量会发生什么?

例如:

void fun(const vector<vector<int>::iterator> &vec);
Run Code Online (Sandbox Code Playgroud)

函数内部的vec元素是有趣的const_iterator还是迭代器?可以修改它们吗?

提前致谢!

c++ iterator const vector const-iterator

1
推荐指数
1
解决办法
268
查看次数

是否可以重用通常的迭代器来构建const迭代器?

研究

我找到了这个老答案.我想知道解决方案是否仍然有效,或者是否有更新,更有效的方法.

背景

让我们假设我有一个像下面这样的迭代器(细节并不重要,只是它很大):

    class inorder_iterator : public std::iterator<std::forward_iterator_tag, token>
    {
        friend syntax_tree;

        node* current_node;
        std::stack<node*> prev_nodes;
        //std::stack<node*> visited_nodes;
        std::map<node*, bool> visited;
    public:
        inorder_iterator();

        inorder_iterator& operator++();
        inorder_iterator operator++(int);

        token& operator*();
        const token& operator*() const;

        token* operator->();
        const token* operator->() const;

        friend bool operator==(const inorder_iterator lhs, const inorder_iterator rhs);
        friend bool operator!=(const inorder_iterator lhs, const inorder_iterator rhs);

    private:
        inorder_iterator(node* current);
        node* find_leftmost_node(node* from);
    };
Run Code Online (Sandbox Code Playgroud)

问题

成员函数声明的实现具有合理的大小,但我想重用当前的迭代器来减少代码重复.

理念

想到的第一个想法就是在node类型上进行模板化,所以我可以通过const node使它成为const迭代器,但它听起来很腥

template <typename Node>
//replace every occurrence …
Run Code Online (Sandbox Code Playgroud)

c++ code-reuse const-iterator c++14

1
推荐指数
1
解决办法
318
查看次数

是否应该避免从非const迭代器到const迭代器的转换?

我试图比较a const iterator和a,non-const iterator但不确定它是否正常,所以我查了一下.由于隐式转换为non-const iterator,我发现它没问题const iterator.但是,我想知道您是否应该不要比较这些迭代器,以避免这种转换.例如,

begin_iterator = buf.begin();  end_iterator = buf.cend();
for (; begin_iterator != end_iterator; ++begin_iterator) { ... }
Run Code Online (Sandbox Code Playgroud)

通常,我会认为这是正常的,因为const意味着只读,这很好.但是,我不确定(不必要的)转换.

c++ iterator const-iterator

1
推荐指数
1
解决办法
79
查看次数

标签 统计

c++ ×10

const-iterator ×10

iterator ×7

c++11 ×3

vector ×3

c++14 ×2

stl ×2

auto ×1

code-reuse ×1

const ×1

erase ×1

gcc ×1

list ×1

set ×1

visual-studio-2013 ×1