标签: stdmap

如何避免const转换为地图访问?

我有以下问题:

std::map<A*,double> map;

void getColor(A const * obj){
    double d = map[obj]; // does not compile wihtout const_cast<A*>(obj)
    // do something
}
Run Code Online (Sandbox Code Playgroud)

我有一个地图std::map(某处)存储指向对象的指针A.我有一个操纵对象的函数getColor, 因此将指针 作为输入.Aconst A

如果getColor不使用const_cast ,函数将无法编译.

const cast是一个设计问题,但如果我不想map const中创建键,我不知道如何规避它.

任何帮助赞赏.

c++ stdmap c++11 c++14

20
推荐指数
2
解决办法
1271
查看次数

为什么在调用std :: map :: clear()之后仍然可以访问内存?

我正在观察std :: map :: clear()的奇怪行为.这个方法应该在调用时调用元素的析构函数,但是在调用clear()之后仍然可以访问内存.

例如:

struct A
{
  ~A() { x = 0; }
  int x;
};

int main( void )
{
  std::map< int, A * > my_map;
  A *a = new A();
  a->x = 5;
  my_map.insert( std::make_pair< int, *A >( 0, a ) );

  // addresses will be the same, will print 5
  std::cout << a << " " << my_map[0] << " " << my_map[0]->x << std::endl;

  my_map.clear();

  // will be 0
  std::cout << a->x << std::endl; …
Run Code Online (Sandbox Code Playgroud)

c++ stdmap

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

std :: map的线程安全性,用于只读操作

我有一个std :: map,用于将值(字段ID)映射到人类可读的字符串.当我的程序在任何其他线程启动之前启动时,此映射会初始化一次,之后永远不会再次修改.现在,我给每个线程自己的这个(相当大的)地图的副本,但这显然是低效的内存使用,它减慢了程序启动速度.所以我想给每个线程一个指向地图的指针,但这会引发一个线程安全问题.

如果我正在做的就是使用以下代码从地图中读取:

std::string name;
//here N is the field id for which I want the human readable name
unsigned field_id = N; 
std::map<unsigned,std::string>::const_iterator map_it;

// fields_p is a const std::map<unsigned, std::string>* to the map concerned.
// multiple threads will share this.
map_it = fields_p->find(field_id);
if (map_it != fields_p->end())
{
    name = map_it->second;
}
else
{
    name = "";
}
Run Code Online (Sandbox Code Playgroud)

这是否有效或者从多个线程读取std :: map有问题吗?

注意:我目前正在使用visual studio 2008,但我希望这可以在大多数主要的STL实现中使用acros.

更新:已编辑的代码示例,用于const正确性.

c++ multithreading stl stdmap thread-safety

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

在Map中查找最小值

我有一张地图,我想在地图中找到最小值(右侧).现在我就是这样做的

bool compare(std::pair<std::string ,int> i, pair<std::string, int> j) {
  return i.second < j.second;
}
////////////////////////////////////////////////////
std::map<std::string, int> mymap;

mymap["key1"] = 50;
mymap["key2"] = 20;
mymap["key3"] = 100;

std::pair<char, int> min = *min_element(mymap.begin(), mymap.end(), compare); 
std::cout << "min " << min.second<< " " << std::endl;
Run Code Online (Sandbox Code Playgroud)

这工作正常,我能够得到问题的最小值当我把这个代码放在我的班级里它似乎不起作用

int MyClass::getMin(std::map<std::string, int> mymap) {
  std::pair<std::string, int> min = *min_element(mymap.begin(), mymap.end(), 
                                                 (*this).compare);
                                                 // Error probably due to "this".
  return min.second; 
}

bool MyClass::compare(
    std::pair<std::string, int> i, std::pair<std::string, int> j) { 
  return i.second < j.second; 
} …
Run Code Online (Sandbox Code Playgroud)

c++ dictionary stl stdmap minimum

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

为什么const_iterator可以与std :: map :: erase一起使用

我下的印象,一个不能使用eraseconst iterator.检查此代码.
为什么以下代码编译(C++ 11,gcc)?

long getMax(const bool get_new)
{
    long max_val=0;

    TO now=getNow();

    map<TO, long>& m=get_new?m_new:m_old;

    for(auto it=m.cbegin(); it !=m.cend())
    {
        if(now.compareTime((*it).first)<lookback)
        {
            max_val=max(max_val,
                        (*it).second);
            ++it;
        }
        else
        {
            it=m.erase(it);
        }
    }

    return max_val;
}
Run Code Online (Sandbox Code Playgroud)

地图本身不是恒定的,但我的理解是,const iterator应该使这一失败.

c++ iterator stdmap const-iterator c++11

17
推荐指数
2
解决办法
889
查看次数

将std :: map复制到std :: vector of pairs中

我正在尝试将地图复制到对的向量中,因此我可以通过对的second数据成员对向量进行排序.我已经解决了这样做:

void mappedWordsListSorter(){
  for (auto itr = mappedWordsList.begin(); itr != mappedWordsList.end(); ++itr){
    vectorWordsList.push_back(*itr);
  }
  sort(vectorWordsList.begin(), vectorWordsList.end(), [=](pair<string, int>& a, pair<string, int>& b){return a.second > b.second;});
}
Run Code Online (Sandbox Code Playgroud)

我需要找到一种方法来实现这一点而不使用原始循环,而是使用标准库.我通过传递地图的键或值来遇到很多例子.我需要复制到一个矢量pairs<string, int>.最好的方法是什么?

c++ stdmap stdvector c++-standard-library std-pair

17
推荐指数
3
解决办法
1272
查看次数

为什么std :: unordered_map有一个保留方法?

根据这个你不能为std::map以下空间预留空间:

不,地图的成员内部存储在树结构中.在知道要存储的键和值之前,无法构建树.

从这一点可以明显看出为什么std::map缺少一种reserve()方法,它在cppreference.com上做了.但是,std::unordered_map 确实有一个reserve()方法,但是当我尝试使用它时operator[],insert()或者emplace()尽管我reserve()先调用它们,它们都会分配内存.

怎么了?为什么不能reserve()妥善保留所需的空间?如果它与地图一样,你不能事先分配内存,那为什么std::unordered_map甚至首先有一个reserve()方法呢?

c++ memory stdmap visual-c++

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

C++ const std :: map引用无法编译

是否有理由将参数传递给std::mapas作为导致[]运算符中断?当我使用const时,我得到这个编译器错误(gcc 4.2):

错误:'map [name]'中'operator []'不匹配

这是函数原型:

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);
Run Code Online (Sandbox Code Playgroud)

而且,我应该提一下,当我删除const前面的关键字时没有问题std::map.

如果我被正确指示,[]运算符实际上会在地图中找到一个新对,如果找不到密钥,这当然可以解释为什么会发生这种情况,但我无法想象这会是可接受的行为

如果有更好的方法,比如使用find代替[],我会很感激.我似乎无法找到工作,虽然...我收到const不匹配的迭代器错误.

c++ stdmap std find operator-keyword

15
推荐指数
2
解决办法
1万
查看次数

从std :: map中查找具有最大值的元素

我正在尝试从std :: map获取具有最大值的元素,

int main() {
    map<int, int> m;
    m[1] = 100;
    m[2] = -1;

    auto x = std::max_element(m.begin(), m.end(), m.value_comp());

    cout << x->first << " : " << x->second << endl;
}
Run Code Online (Sandbox Code Playgroud)

为什么它打印第二个元素2 : -1

c++ stdmap std

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

std :: map &lt;K,V&gt; :: iterator是否实例化std :: map &lt;K,V&gt;?

我有此代码,它适用于GCC:

#include <map>

class Foo;
class Bar;

typedef std::map<Foo,Bar> MyMap;

MyMap::iterator i;

class Foo
{
    MyMap::iterator some_data;
};
Run Code Online (Sandbox Code Playgroud)

当前设计的代码(令人讨厌的是,是的,是我一直坚持使用的代码)要求map<Foo,Bar>::iterator可用于FooBar

之所以起作用,是因为GCC库实现恰好不需要实例化地图的键类型来实例化迭代器。

这样可以保证吗?在定义映射迭代器类型时,该标准似乎有些过时。该代码的移植性如何?

c++ templates iterator stdmap c++-standard-library

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