性能方面,使用之间确实存在很大差异:
当然,对于foreach | iterator循环,我必须明确地比较这些方法并相应地返回true或false.
我正在比较的对象是一个对象,其中equals()和hashcode()都被正确覆盖.
编辑:毕竟不需要知道containsValue,对不起.是的,我很愚蠢...我意识到我的问题是关于containsKey vs foreach是多么愚蠢,没关系,我不知道我在想什么.我基本上想知道上面的内容(编辑出其他内容).
我在第8行有一个运行时错误"map/set iterators incompatible".
void Manager::Simulate(Military* military, Shalishut* shalishut,char* args[]){
Simulation* simulation = Simulation::GetInstance();
Time* time = Time::GetInstance();
multimap<int,Task*>::iterator itTasks;
itTasks = simulation->GetTasks().begin();
while(itTasks != simulation->GetTasks().end()){
while (itTasks->second->GetTimeStamp() == time->GetTime()){ /*line 8 - ERROR*/
TaskExecute(itTasks->second,military,shalishut,args);
itTasks++;
}
// Unit take car of vehicles
time->TimeIncrease();
}
}
Run Code Online (Sandbox Code Playgroud)
Simulation被宣布为multimap<int,Task*>.问题是什么?
我试图在循环中使用迭代器在字符串上执行if语句,但无法弄清楚如何获取if语句的当前字符:
for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i) {
if (!isalpha(*i) && !isdigit(*i)) {
if(i != "-") { // obviously this is wrong
buffer.erase(i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我获取当前字符,以便我可以做一些额外的if语句吗?
我已经尝试了我的G ++版本的C++ 0x初始化列表实现,但它只输出空行.
#include <initializer_list>
#include <iostream>
#include <string>
int main() {
std::initializer_list<std::string> a({"hello", "stackoverflow"});
for(auto it = a.begin(), ite = a.end(); it != ite; ++it)
std::cout << *it << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我不知道我做错了什么.有人可以帮帮我吗?
嗨,所以我有点困惑迭代器和它们实际上是......在C++ STL中
在这种情况下我使用列表,我不明白你为什么要做一个迭代器:
std::list <int>::const_iterator iElementLocator;
由derefrence运算符dipslay列表的内容:
cout << *iElementLocator;
将它分配给list.begin()之后;
请解释一下迭代器究竟是什么以及我为什么要使用它/使用它!
谢谢!!
考虑以下交互式示例
>>> l=imap(str,xrange(1,4))
>>> list(l)
['1', '2', '3']
>>> list(l)
[]
Run Code Online (Sandbox Code Playgroud)
有没有人知道是否已经在某处实现了一个版本的imap(和其他itertools函数),这样第二次执行列表(l)就会得到与第一次相同的结果.而且我不想要常规地图,因为如果使用更大的范围,在内存中构建整个输出可能会浪费内存.
我想要的东西基本上就像是
class cmap:
def __init__(self, function, *iterators):
self._function = function
self._iterators = iterators
def __iter__(self):
return itertools.imap(self._function, *self._iterators)
def __len__(self):
return min( map(len, self._iterators) )
Run Code Online (Sandbox Code Playgroud)
但如果有人已经这样做,那么对所有itertools手动执行此操作将是浪费时间.
PS.你认为容器比迭代器更禅,因为对于迭代器而言
for i in iterator:
do something
Run Code Online (Sandbox Code Playgroud)
当您明确需要删除元素的容器时,隐式清空迭代器.
我一直在上下堆栈流,甚至非常非常好的Dobbs博士的文章,但我找不到这个问题的明确答案.
问题答案的一部分std :: reverse_iterator的缺点是什么?说它可能根本不可能.
std::list::reverse_iterator it = list.rbegin();
while( it != list.rend() )
{
int value=*it;
if( some_cond_met_on(value) )
{
++it;
list.erase( it.base() );
}
else
{
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
PS:我知道还有其他选择,比如erase_if(),但我正在寻找这个具体问题的答案.
所述<algorithm>头部提供std::equal_range(),以及具有作为它的成员函数的一些容器.让这个函数困扰我的是它返回一对迭代器,使得从开始迭代器迭代到结束迭代器变得繁琐.我希望能够使用std::begin(),std::end()以便我可以使用基于C++ 11范围的for循环.
现在,我听到关于矛盾的信息,以专业std::begin()和std::end()-我已经被告知,添加什么不确定的行为std命名空间的结果,而我也被告知,你可以提供自己的专长std::begin()和std::end().
这就是我现在正在做的事情:
namespace std
{
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter begin(pair<Iter, Iter> const &p)
{
return p.first;
}
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter end(pair<Iter, Iter> const &p)
{
return p.second;
}
}
Run Code Online (Sandbox Code Playgroud)
这确实有效:http://ideone.com/wHVfkh
但我想知道,这样做的缺点是什么?有一个更好的方法吗?
场景:
对于包含3个元素[A,B,C]的列表:
您可以根据需要循环访问它.并且还有一个额外的计数功能记录每个元素的访问计数.
例如,如果访问它7次,应返回:
[A, B, C, A, B, C, A]
并具有以下每个元素的访问计数:
+–––––––––––+–––––––––––––––+
| Element | Access count |
+–––––––––––––––––––––––––––+
| A | 3 |
+–––––––––––––––––––––––––––+
| B | 2 |
+–––––––––––––––––––––––––––+
| C | 2 |
+–––––––––––+–––––––––––––––+
任何回应将不胜感激.
问候.
更新
添加另一个允许调用者指定应该过滤的元素列表的附加函数.仍然使用7次访问作为示例,过滤[C]:
[A, B, A, B, A, B, A]
+–––––––––––+–––––––––––––––+
| Element | Access count |
+–––––––––––––––––––––––––––+
| A | 4 |
+–––––––––––––––––––––––––––+
| B | 3 |
+–––––––––––––––––––––––––––+
| C | 0 |
+–––––––––––+–––––––––––––––+
并且,随后对getNextOne()的调用应始终获取访问计数低的模拟(模拟负载平衡的访问计数实现).因此,如果第二个调用者尝试访问它10次,则应返回:
[C, C, C, … 我正在寻找一种简单的方法来为mapC++ 11中的a值创建一个迭代器.
这个方法应该简单透明:简单,因为它应该易于实现,并且透明,因为客户端不应该知道值来自地图而不是集合.
之前已经多次询问过这个问题.其中许多问题早于C++ 11并使用boost,我不想使用它.有些并不简单,John Ahlgren的解决方案,例如http://john-ahlgren.blogspot.com/2013/10/how-to-iterate-over-values-of-stdmap.html,例如需要一页代码编写自定义迭代器.
其他人不透明,即显然可以写:
map<string,foo> mymap;
for (auto it=mymap.begin();it!=mymap.end();++it){
Foo val= it->second;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我不想这样做,因为我不希望客户端必须知道数据表示.
问题出现如下.
我有一堆用长"钥匙"唯一索引的对象.有时我想操纵这些对象的集合.其他时候我想要检索一个给定键的对象.
我不能直接使用"set"类有几个原因,其中主要是它不存储可变实例,并且这些实例必须是可变的(显然,除了键之外).
所以,我决定将所有对象存储在一个巨大的全局哈希表中:
map<long,Foo> all_the_objects;
Run Code Online (Sandbox Code Playgroud)
然后我根本不工作set<Foo>.相反,我使用set<long>并使用适配器来模拟一组Foo,即
class SetOfFoo{
private: set<long> theKeys;
public:
void insert(const & Foo);
size_t size() return theKeys.size();
bool is_member(const & Foo)
{return theKeys.find(Foo.key)
!= theKeys.end;}
Foo & insert(const & Foo val){
long key=val.key;
all_the_objects[key]=val;
return all_the_objects[key];
}
...::iterator begin() {???}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,SetOfFoo类的客户端不知道或不需要知道SetOfFoo是作为一组键实现的.
我也不能在适配器类中自己创建一个Vector,因为无法在C++集合中存储引用.
是否真的不可能以简单,透明的方式迭代map <>值?我觉得很难相信,因为这是一个非常普遍的需求,并且在我看到的每种语言中都有微不足道的事情.我只是不明白这怎么可能很难.