小编Blu*_*jay的帖子

C++ 11 for循环语法无法正常工作

我正在使用SFML作为学习练习制作Arkanoid克隆.对于PowerUp类,我有一个像这样的更新方法:

void PowerUp::update(FrameTime mFT) {
  if (!(bottom() >= windowHeight))
    shape.move(velocity * mFT);
  else
    onGround = true;
}
Run Code Online (Sandbox Code Playgroud)

在我的PowerUpManager类中,我有一个PowerUp向量,这个函数可以立即更新所有PowerUp:

void PowerUpManager::update(FrameTime mFT) {
  for (auto powerUp : mPowerUps)
    powerUp.update(mFT);
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用.如果我运行这个代码,那么在产生之后,通电就会保持不变,并且不要向下移动,就像它们应该的那样.但是,如果我更换

for (auto powerUp : mPowerUps)
  powerUp.update(mFT);
Run Code Online (Sandbox Code Playgroud)

与更传统但更老式的

for (int i{ 0 }; i < mPowerUps.size(); ++i)
  mPowerUps[i].update(mFT);
Run Code Online (Sandbox Code Playgroud)

,一切正常,应该如此.这告诉我这些2位代码的含义有所不同.据我所知,前者只是后者的新C++语法糖版本.有什么我想念的吗?

更奇怪的是,我的所有功能,

void PowerUpManager::draw(sf::RenderWindow& window) {
  for (auto powerUp : mPowerUps)
    powerUp.draw(window);
}
Run Code Online (Sandbox Code Playgroud)

,工作正常,没有问题.

c++ foreach for-loop c++11

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

std :: find中的Lambda问题

我有一张地图如下:

std::map<int, std::unique_ptr<Person>> ratingMap;
Run Code Online (Sandbox Code Playgroud)

我想创建一个函数,它接受一个字符串参数_name并遍历地图,直到它找到一个具有相同名称的人:

void Person::deleteFromMap(const std::string& _name){
    //Searches the map for a person whose name is the same as the argument _name
    auto found = std::find(ratingMap.begin(), ratingMap.end(),
        [&](const std::unique_ptr<Person>& person) -> bool{return person->getName() == _name; });
Run Code Online (Sandbox Code Playgroud)

但是,这拒绝编译并给出以下错误:

错误1错误C2678:二进制'==':找不到哪个运算符带有'std :: pair'类型的左操作数(或者没有可接受的转换)

我已经花了将近两个小时尝试其中的变体以试图让它工作,因为我在过去编写了类似的lambda函数,这些函数已按预期编译和工作.为什么会这样?

c++ lambda stdmap find c++11

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

带有原始指针的唯一指针.at()的映射

说我有一张地图:

std::map<std::unique_ptr<SomeType>, SomeOtherType> map;
Run Code Online (Sandbox Code Playgroud)

显然,这是行不通的,因为我们地图的键值是唯一的ptr,而不是原始的:

//a pointer from somewhere else in the code
SomeType* p = ...;
auto result {map.at(p)};
Run Code Online (Sandbox Code Playgroud)

相反,可以使用std :: unique_ptr.get()执行以下操作:

SomeType* p = ...;
for(auto& entry : map) {
    if(entry.first.get() == p) {
        //do whatever
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这是一种非常丑陋且可能效率不高的方法。我的问题很简单,在这种情况下是否有某种方式可以使用.at()函数。

c++ dictionary pointers std unique-ptr

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

标签 统计

c++ ×3

c++11 ×2

dictionary ×1

find ×1

for-loop ×1

foreach ×1

lambda ×1

pointers ×1

std ×1

stdmap ×1

unique-ptr ×1