今天我跑了一个非常微妙的问题,我想请你的意见。 考虑以下花园式的共同成语成语课: struct S { S() : p_impl(new impl) {} private: struct impl; boost::shared_ptr<impl> p_impl; }; 当你试图用下列方法把它们放到vector中时,乐趣就会出现: std::vector<S> v(42); 现在,至less在MSVC 8中, v所有元素共享相同的impl成员。 其实,是什么导致这是vector构造函数: template <typename T, typename A = …> class vector { vector(size_t n, const T& x = T(), const A& a = A()); … }; 在场景下,只有一个S对象被默认构造, vector的n元素被复制。 现在,用C ++ 11,有右值引用。 所以它不能这样工作。 如果一个vector被构造成 std::vector<S> […]
我想知道如何实现STL地图按值sorting。 例如,我有一张地图m map<int, int>; m[1] = 10; m[2] = 5; m[4] = 6; m[6] = 1; 然后..我想分类与米的价值。 所以,如果我打印地图,我想要得到的结果 m[6] = 1 m[2] = 5 m[4] = 6 m[1] = 10 这个。 我怎么能这样sorting? 有没有什么办法可以处理与sorting值的关键和价值?
这不是一个devise问题,虽然它可能看起来像。 (好吧,这是一个devise问题)。 我想知道的是为什么C ++ std::fstream类不在构造函数或打开方法中使用std::string 。 每个人都喜欢这样的代码示例: #include <iostream> #include <fstream> #include <string> int main() { std::string filename = "testfile"; std::ifstream fin; fin.open(filename.c_str()); // Works just fine. fin.close(); //fin.open(filename); // Error: no such method. //fin.close(); } 这使我一直在处理文件。 当然,C ++库会尽可能使用std::string 。
我发现C ++的STL方法做简单的集合操作非常笨重。 例如,要find两组之间的区别: std::set<int> newUserIds; set_difference(currentUserIds.begin(), currentUserIds.end(), mPreviousUserIds.begin(), mPreviousUserIds.end(), std::inserter(newUserIds, newUserIds.end())); std::set<int> missingUserIds; set_difference(mPreviousUserIds.begin(), mPreviousUserIds.end(), currentUserIds.begin(), currentUserIds.end(), std::inserter(missingUserIds, missingUserIds.end())); mPreviousUserIds = currentUserIds; boost是否提供了一个可以减less上述例子的替代类: set_type<int> newUserIds = currentUserIds.difference(mPreviousUserIds); set_type<int> missingUserIds = mPreviousUserIds.difference(currentUserIds); (类似于Qt中的QSet ,以这种方式覆盖operator- )。
一般认为C ++标准库通常不是用inheritance来扩展的。 当然,我(和其他人)批评那些build议派生自std::vector 。 但是,这个问题: c ++的exception,可以什么()是NULL? 使我意识到,至less有一部分标准库是打算如此扩展 – std::exception 。 所以,我的问题有两个部分: 还有其他的标准库类是从哪里来的? 如果从标准库类(如std::exception派生,是否由ISO标准中描述的接口绑定? 例如,一个使用exception类的程序谁是what()成员函数没有返回一个NTBS(说它返回一个空指针)是标准符合?
根据斯科特·迈耶斯(Scott Meyers)在其有效的STL书籍 – 第46项。他声称std::sort比std::qsort速度快670%,这是由于内联的缘故。 我testing了自己,我看到qsort更快:(!谁能帮我解释这个奇怪的行为? #include <iostream> #include <vector> #include <algorithm> #include <cstdlib> #include <ctime> #include <cstdio> const size_t LARGE_SIZE = 100000; struct rnd { int operator()() { return rand() % LARGE_SIZE; } }; int comp( const void* a, const void* b ) { return ( *( int* )a – *( int* )b ); } […]
比较 double average = CalculateAverage(values.begin(), values.end()); 同 double average = std::for_each(values.begin(), values.end(), CalculateAverage()); 在函数中使用函子有什么好处? 是不是第一个更容易阅读(甚至在添加实现之前)? 假设仿函数是这样定义的: class CalculateAverage { private: std::size_t num; double sum; public: CalculateAverage() : num (0) , sum (0) { } void operator () (double elem) { num++; sum += elem; } operator double() const { return sum / num; } };
如何从STL容器中删除具有指定值或满足某些条件的元素? 对于不同种类的容器,是否有一种统一或统一的方法?
我喜欢vector很多。 他们漂亮,快速。 但是我知道这个叫valarray的东西存在。 为什么我会用valarray代替vector? 我知道valarrays有一些语法糖,但除此之外,它们何时有用?
在文章中多次阅读索赔 – 我想将此问题添加到Stackoverflow,并要求社区 – 是下面的代码可移植? template<template<typename T, typename Alloc> class C> void f() { /* some code goes here … */ } int main() { f<std::vector>(); } 提供std::vector的实现是否真的允许超出两个众所周知的额外的默认模板参数? 这会使上面的代码格式不正确,因为它假定有两个模板参数。 有关这种索赔的示例,请参阅本文的最后一段。