我发现VS2005上的标准哈希函数在尝试实现高性能查找时非常缓慢。 快速有效的散列algorithm有哪些好的例子可以消除大多数的冲突?
以下C ++代码格式良好: void consumer(char const* p) { std::printf("%s", p); } std::string random_string_generator() { // returns a random std::string object } consumer(random_string_generator().c_str()); 我用它的问题是,创build临时std :: string对象并采取c_str()指针后,没有任何东西可以防止std :: string对象被破坏(或者我错了?)。 你可以请指点我的标准,如果代码是确定的,尽pipe一切。 它工作,当我用g ++testing。
有什么方法吗? 我的电脑是AMD64。 ::std::string str; BOOL loadU(const wchar_t* lpszPathName, int flag = 0); 当我使用: loadU(&str); VS2005编译器说: Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *' 我该怎么做?
我希望能够在std :: vector及其底层C数组int *之间进行转换,而不显式复制数据。 std :: vector是否提供对底层C数组的访问? 我正在寻找这样的东西 vector<int> v (4,100) int* pv = v.c_array(); 编辑: 此外,是否有可能做相反的事情,即如何从C数组初始化std::vector而不复制? int pv[4] = { 4, 4, 4, 4}; vector<int> v (pv);
从STL范围获得[伪]随机元素的好方法是什么? 我可以想出最好的做法是做std::random_shuffle(c.begin(), c.end()) ,然后从c.begin()取出我的随机元素。 不过,我可能需要一个来自const容器的随机元素,或者我可能不想要一个完整的shuffle的成本。 有没有更好的办法?
将lambdaexpression式看作可调用对象的“语法糖”,可以表示无名的基础types吗? 一个例子: struct gt { bool operator() (int l, int r) { return l > r; } } ; 现在, [](int l, int r) { return l > r; } [](int l, int r) { return l > r; }是上述代码的优雅替代品(加上可调用对象的必要创build),但有没有一种方法来expressionGT(types)本身? 一个简单的用法: std::set<int, gt> s1; // A reversed-order std::set // Is there a way to do […]
我知道at()慢于[]是因为它的边界检查,这也是类似的问题,如C ++向量在/ []运算符速度或:: std :: vector :: at()vs运算符[] < <令人惊讶的结果! 慢5到10倍/更快! 。 我只是不明白at()方法的好处。 如果我有这样一个简单的向量: std::vector<int> v(10); 我决定通过使用at()而不是[]来访问它的元素,当我有一个索引i ,我不确定它是否在向量边界,它迫使我用try-catch块包装它 : try { v.at(i) = 2; } catch (std::out_of_range& oor) { … } 尽pipe我可以通过使用size()来获得相同的行为,并且自己检查索引,这对我来说似乎更容易和方便: if (i < v.size()) v[i] = 2; 所以我的问题是: 使用vector :: at over vector :: operator []的优点是什么? 什么时候应该使用vector :: at而不是vector :: size + vector […]
任何人都可以告诉我如何增加迭代器2? iter++可用 – 我必须做iter+2吗? 我怎样才能做到这一点?
当使用STL的sort()或min_element()函数时,我总是必须明确地指定范围的开始和结束: void range_example() { std::vector<int> list = {7, 3, 9, 1, 5, 2}; auto found_element = std::min_element(list.begin(), list.end()); std::cout << *found_element << std::endl; } 这是有道理的,如果我打算只在我的容器的一部分工作,但更多的时候我需要function在整个容器上工作。 是否有一个原因,为什么没有一个重载的function,允许这样做: std::vector<int> list = {7, 3, 9, 1, 5, 2}; auto found_element = std::min_element(list); 有没有办法完成一个我忽略的容器的总范围的函数调用? 编辑:我知道,我可以封装在一个函数本身,但因为这必须做所有function,我想避免,如果有更好的办法。
在这个问题中 ,如何通过2个元素来调整迭代器到STL容器,提供了两种不同的方法: 要么使用算术运算符的forms – + = 2或++两次 或使用std :: advance() 当迭代器指向STL容器的最后一个元素或更高版本时,我已经用VC ++ 7testing了它们的边界情况: vector<int> vec; vec.push_back( 1 ); vec.push_back( 2 ); vector<int>::iterator it = vec.begin(); advance( it, 2 ); bool isAtEnd = it == vec.end(); // true it++; // or advance( it, 1 ); – doesn't matter isAtEnd = it == vec.end(); //false it = […]