标签: iterator

重命名地图迭代器的第一个和第二个

有没有办法重命名map迭代器的第一个和第二个访问器函数.我知道他们有这些名称是因为代表键和值的底层对,但我希望迭代器更具可读性.我认为这可能是使用迭代器适配器,但我不知道如何实现它.

请注意,我不能使用提升.

我的意思是:

map<Vertex, Edge> adjacency_list;
for(map<Vertex, Edge>::iterator it = adjacency_list.begin();
    it != adjacency_list.end();
    ++it)
{
    Vertex v = it->first;
    //instead I would like to have it->vertex
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl map

19
推荐指数
5
解决办法
8920
查看次数

如何使用std :: copy将一个地图复制到另一个地图?

我想将一个std :: map的内容复制到另一个.我可以用std::copy它吗?显然,以下代码不起作用:

int main() {
  typedef std::map<int,double> Map;
  Map m1;
  m1[3] = 0.3;
  m1[5] = 0.5;
  Map m2;
  m2[1] = 0.1;
  std::copy(m1.begin(), m1.end(), m2.begin());
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不会因为工作copy会叫operator*m2.begin()为"解引用",并分配一个值(所有值的类型的std::pair<const int, double>).然后它将调用operator++移动到下一个空间m2.这两个操作都因为constin const int而无法工作,并且没有为任何新元素保留空间.

有没有办法让它适用std::copy

谢谢!

c++ iterator stl copy map

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

为什么这个向量迭代器不可递增?

我正在尝试删除向量的内容而我收到错误 - 向量迭代器不可递增,为什么会这样?

这是我的析构函数:

City::~City()
{
    vector <Base*>::iterator deleteIterator;
    for (deleteIterator = m_basesVector.begin() ; deleteIterator != m_basesVector.end() ; deleteIterator++)
        m_basesVector.erase(deleteIterator);
}  
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ iterator memory-management vector

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

对集合进行线程安全迭代

我们都知道在使用时Collections.synchronizedXXX(例如synchronizedSet())我们获得了底层集合的同步"视图".

但是,这些包装器生成方法的文档指出,在使用迭代器迭代集合,我们必须在集合上显式同步.

您选择哪个选项来解决此问题?

我只能看到以下方法:

  1. 按照文档说明:对集合进行同步
  2. 在致电之前克隆集合 iterator()
  3. 使用迭代器是线程安全的集合(我只知道CopyOnWriteArrayList/ Set)

并且作为一个额外的问题:当使用同步视图时 - 使用foreach/Iterable线程安全吗?

java collections multithreading iterator thread-safety

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

在Java TreeMap中查找元素位置

我正在使用字符串的TreeMap TreeMap<String, String>,并使用它来实现单词的Dictionay.

然后我有一个文件集合,并希望在字典定义的向量空间(单词空格)中创建每个文件的表示.

每个文件都应该有一个向量来表示它,具有以下属性:

  • 矢量应该与字典大小相同
  • 对于文件中包含的每个单词,向量在与字典中的单词位置对应的位置应该具有1
  • 对于未包含在文件中的每个单词,向量在与字典中的单词位置对应的位置应该具有-1

所以我的想法是使用a Vector<Boolean>来实现这些向量.(这种表示集合中文档的方式称为布尔模型 - http://www.site.uottawa.ca/~diana/csi4107/L3.pdf)

我在创建这个向量的过程中遇到的问题是我需要一种方法来查找字典中单词的位置,如下所示:

String key;
int i = get_position_of_key_in_Treemap(key); <--- purely invented method...
Run Code Online (Sandbox Code Playgroud)

1)我可以在TreeMap上使用这样的方法吗?如果没有,你能不能提供一些代码来帮助我自己实现它?

2)TreeMap上是否有一个迭代器(它按字母顺序排列),我可以获得它的位置?

3)最终我应该使用另一个类来实现字典?(如果你认为使用TreeMaps我不能做我需要的)如果是的话,哪个?

提前致谢.

增加部分:

由dasblinkenlight提出的解决方案看起来很好,但是存在复杂性问题(由于将密钥复制到数组中而与字典的维度呈线性关系),并且不能接受为每个文件执行此操作的想法.

对我的问题还有其他想法吗?

java dictionary iterator treemap sortedmap

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

为什么std :: list上的push_back改变了用rbegin初始化的反向迭代器?

根据我发现的一些STL文档,在std :: list中插入或删除元素不会使迭代器失效.这意味着允许循环遍历列表(从begin()to end()),然后使用push_front添加元素.

例如,在下面的代码中,我使用元素a,b和c初始化一个列表,然后遍历它并执行元素的push_front.结果应该是cbaabc,这正是我得到的:

std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");

for (std::list<std::string>::iterator itList = testList.begin(); itList != testList.end(); ++itList)
   testList.push_front(*itList);

for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
   std::cout << *itList << std::endl;
Run Code Online (Sandbox Code Playgroud)

当我使用反向迭代器(从rbegin()to 循环rend())并使用push_back时,我会期望类似的行为,即abccba的结果.但是,我得到了不同的结果:

std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");

for (std::list<std::string>::reverse_iterator itList = testList.rbegin(); itList != testList.rend(); ++itList)
   testList.push_back(*itList);

for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
   std::cout << *itList << std::endl;
Run Code Online (Sandbox Code Playgroud)

结果不是abccba,但是abcccba.这是正确的,还有一个额外的c.

看起来第一个push_back也改变了用rbegin()初始化的迭代器的值.在push_back之后,它不再指向列表中的第3个元素(之前是最后一个元素),而是指向第4个元素(现在是最后一个元素).

我使用Visual Studio …

c++ iterator stl

19
推荐指数
2
解决办法
5154
查看次数

C++ deque:迭代器失效时

如果我错了,请纠正我.谢谢!

insert并且erase将重新定位元素,但是在插入/擦除发生的位置之前的元素不会重新定位,因此它们的迭代器保持有效.

push_back并且pop_back不要使任何迭代器无效.

push_frontpop_front无效所有迭代器.

swap 不会重新定位元素,但不知何故,我认为它应该使迭代器无效.

c++ iterator stl deque

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

Java8生成器的无限序列自然数

我用Java8 定义naturalStream自然数的无限序列()iterator.

IntStream natural = IntStream.iterate(0, i -> i + 1);

natural
 .limit(10)
 .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

现在,我想用Java8定义它generator.

静态流生成(供应商)

什么是最简单的方法?谢谢.

java iterator generator java-8

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

如何在java中迭代Map?

我需要遍历a BucketMap并获取所有内容,keys但是如何在不buckets[i].next.next.next.key尝试手动操作的情况下进行操作,如我在此处尝试的那样:

public String[] getAllKeys() {

    int j = 0;      //index of string array "allkeys"

    String allkeys[] = new String[8];

    for(int i = 0; i < buckets.length; i++) { //iterates through the bucketmap

        if(buckets[i] != null) {             //checks wether bucket has a key and value
            allkeys[j] = buckets[i].key;     //adds key to allkeys
            j++;                             // counts up the allkeys index after adding key

            if(buckets[i].next != null) {         //checks wether next has a key and value
                allkeys[j] …
Run Code Online (Sandbox Code Playgroud)

java iterator loops initialization hashmap

19
推荐指数
1
解决办法
6万
查看次数

在Map的entrySet中流与Iterator

据我了解,下面的代码应打印true,因为两者StreamIterator指向的第一个元素.

但是,当我运行以下代码时,它正在打印false:

final HashMap<String, String> map = new HashMap<>();
map.put("A", "B");
final Set<Map.Entry<String, String>> set = Collections.unmodifiableMap(map).entrySet();
Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.stream().findFirst().get();
System.out.println(entry1 == entry2);
Run Code Online (Sandbox Code Playgroud)

不同行为的原因是什么?

java iterator java-8 java-stream entryset

19
推荐指数
2
解决办法
1686
查看次数