例如,我可以用类似于以下的方式定义容器:
template <typename T>
class Example
{
public:
using value_type = T;
using iterator = value_type*;
using const_iterator = const iterator;
//etc
};
Run Code Online (Sandbox Code Playgroud)
但是,可以使用用户定义的迭代器来执行此操作吗?
template<typename T>
class Example
{
public:
using value_type = T;
/*friend?*/ class iterator;
using const_iterator = const iterator; //is this okay?
//etc
};
Run Code Online (Sandbox Code Playgroud)
详细的解释将不胜感激。
我测试了我的程序,并决定将BOOST_FOREACH宏更改为简单for循环const_iterator.
我得到意想不到的结果:程序工作较慢for.
然后我写了小测试应用程序:
std::vector<int> vec;
for (int i = 0; i != 50000000; ++i)
vec.push_back(i);
time_t t1 = clock();
int sum1 = 0;
for (std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it)
sum1 += *it;
std::cout << ulong(clock() - t1);
time_t t2 = clock();
int sum2 = 0;
BOOST_FOREACH(auto &it, vec) {
sum2 += it;
}
std::cout << ulong(clock() - t2);
Run Code Online (Sandbox Code Playgroud)
这是输出:
34963
26964
Run Code Online (Sandbox Code Playgroud)
为什么这样?
我只是想知道我是否可以使用const_iterator更改/更新地图的值。
下面是代码片段:
int main()
{
map <int, int> m;
m.insert(make_pair(1, 10));
map <int, int>::const_iterator itr = m.begin(); //The iterator is const_iterator
itr->second = 30;
cout << itr->second; //The value to be printed is 30, and not 10.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预先感谢您分享您的想法。
我有这个声明:
list<string*>::const_iterator iter;
Run Code Online (Sandbox Code Playgroud)
我想了解的类型是否*iter为:string*,const string*或别的东西。
我读到cost_iterator返回参考。一方面,列表包含string*,迭代器指向这些列表。另一方面,const_iterator它指向的值应该是,const并且它的作用就像列表中的数据是const?尽管不是真的吗?不确定我缺少什么,正确的答案是什么。
我试图从类方法返回 const 反向迭代器。但是当我将方法标记为 时,我的代码无法编译const。没有const代码编译就没有问题。
知道为什么吗?
#include <iostream>
#include <vector>
template <class ValueType>
class DynamicDataComponent {
using ValuesType = std::vector<ValueType>;
using IteratorType = typename std::vector<ValueType>::reverse_iterator;
public:
DynamicDataComponent()
{
values.push_back(0);
values.push_back(1);
values.push_back(2);
values.push_back(3);
}
const IteratorType getRBeginIt() const {
return values.rbegin();
}
private:
ValuesType values;
};
int main() {
DynamicDataComponent<size_t> dataComponent;
std::cout << *dataComponent.getRBeginIt() << "\n";
}
Run Code Online (Sandbox Code Playgroud)