相关疑难解决方法(0)

与foreach在地图上的意外副本

我试图循环地图的条目,我得到意想不到的副本.这是程序:

#include <iostream>
#include <map>
#include <string>

struct X
{
    X()
    {
        std::cout << "default constructor\n";
    }

    X(const X&)
    {
        std::cout << "copy constructor\n";
    }
};

int main()
{
    std::map<int, X> numbers = {{1, X()}, {2, X()}, {3, X()}};
    std::cout << "STARTING LOOP\n";
    for (const std::pair<int, X>& p : numbers)
    {
    }
    std::cout << "ENDING LOOP\n";
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

default constructor
copy constructor
default constructor
copy constructor
default constructor
copy constructor
copy constructor
copy constructor
copy constructor
STARTING LOOP
copy constructor …
Run Code Online (Sandbox Code Playgroud)

c++ foreach map auto c++11

16
推荐指数
2
解决办法
1069
查看次数

为什么迭代器需要是CopyConstructible和CopyAssignable?

根据en.cppreference.com和VC++ 14.0,迭代器需要具有复制构造函数和复制赋值运算符.

我的迭代器类(它通过Windows进程迭代)不能是可复制构造或可复制 - 它拥有一个HANDLE快照并管理释放它所以不可能复制那些 - 移动它们是可能的,我提供了一个移动构造函数和移动赋值运算符.但是,算法会std::find_if复制它们(在VC++ 14.0中是一些std::_Find_if需要复制迭代器的调用)并且不想工作.

为什么你的迭代器会占用资源?迭代器应该像指针指向某个东西.

因为为了遍历Windows进程,您需要创建一个快照,然后使用它来执行此操作 - 问题是,一个快照,一个迭代.快照也不可复制.

为什么他们不能MoveConstructibleMoveAssignable?哪些算法(如果有的话)真的需要复制迭代器才能工作?

c++ iterator

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

标签 统计

c++ ×2

auto ×1

c++11 ×1

foreach ×1

iterator ×1

map ×1