草庐IT

STL_vector

全部标签

c++ - 引用 vector 中的对象(现代 C++)

如果这很简单,我很抱歉,但我已经15年没有玩过C++了。考虑这个简单的例子:vector包含A类型的对象。B类的对象必须引用驻留在vector中的A对象。(编辑澄清-类B必须有一个引用A实例的成员)在过去,您只需声明一个A*就可以了,但是今天如何使用智能指针来完成呢?我不想在vector中存储共享或唯一指针,因为我不想在整个堆上分配A对象。它们必须在vector本身中。 最佳答案 根据您的要求,您有几个选项。非拥有原始指针A*在现代C++中使用非拥有原始指针并没有错。如果B需要对A的可空引用和A可以保证比B长寿那么原始指针就完全没问

c++ - STL 容器的 std::string_view

这是对string_view的一个很好的解释对象是。除了std::string之外,是否有任何STL容器的“_view”对象?在我看来,拥有它是一件非常有用的事情。想象一个std::vector_view类,它只存储一个start迭代器和一个length字段。不真正拥有底层数据可以显着提高效率。 最佳答案 有一个针对span的提议,它是一个连续对象范围的View:http://wg21.link/p0122.另请参阅:Whatisa“span”andwhenshouldIuseone?.GSL库还提供了gsl::span.这可能有点

c++ - 在模板类中定义迭代器时出现 STL 编译错误

下面的代码给出了错误:error:type‘std::list>’isnotderivedfromtype‘Foo’error:expected‘;’before‘iter’#includetemplateclassFoo{public:std::list::iteratoriter;private:std::listelements;};为什么这是正确的? 最佳答案 你需要typenamestd::list::iterator.这是因为list取决于模板参数,因此编译器无法知道名称iterator到底是什么它将在其中(好吧,从技术

c++ - 涉及STL排序算法的令人困惑的SegFault

我正在尝试使用STL重新创建编程明珠第15栏中的程序。我正在尝试使用字符串和索引vector创建后缀数组。我将我读取的单词列表记录在一个名为input的字符串中,该字符串充当我在程序开头从stdin读取的以''分隔的单词列表。在我到达代码的排序部分之前,一切都按预期工作。我想使用STL的排序算法,但我对我似乎正在创建的段错误感到完全困惑。我有:vectorwords;和全局变量stringinput;我定义了我的自定义比较函数:boolwordncompare(unsignedintf,unsignedints){intn=2;while(((f当我运行代码时:sort(words.b

c++ - std::vector 可以 ='d 到另一个 std::vector 吗?

假设我有以下内容:std::vectormyints;然后我有一个返回intvector的函数:std::vectorGiveNumbers(){std::vectornumbers;for(inti=0;i然后我可以做:myints=GiveNumbers();这样做是否安全,使myints中只有数字0到49而没有其他内容?这样做会清楚以前在myints中的内容吗?如果不是,正确的方法是什么?谢谢 最佳答案 是的。这是安全的。您会将GiveNumbers()函数的结果复制到myints中。这可能不是最有效的方法,但它是安全和正确的

c++ - 将 MPL vector 转换为静态数组

我写了一些代码来生成一个boost::mpl::vector用作阶乘函数的查找表,作为对开发人员可能使用的更通用的库函数的测试能够以静态基元数组的形式生成查找表。该函数(最有可能实现为预处理器宏定义)将接受要初始化的数组的名称和大小,以及用作初始化每个元素的元函数的类模板的名称i的数组。我认为在不使用外部脚本的情况下执行此操作的最佳方法是创建一个boost::mpl::vector,如下面的代码list所示,并将数组中每个元素的用户提供的元函数的返回值推送到vector;使用vector的元素初始化静态数组(可能通过使用一系列宏,最后一个宏将使用__VARARGS__宏来完成此操作)。

c++ - vector : rend() is being invalidated by erase()

根据C++规范(23.2.4.3),vector::erase()仅使“删除点之后的所有迭代器和引用”无效因此,当使用reverse_iterators传递所有vector成员时,当前迭代器上的删除应该不会导致rend()成员失效。此代码将在G++下运行,但会在Windows(VS2010)上提供运行时异常:#includeusingnamespacestd;intmain(){vectorx;x.push_back(1);x.push_back(2);x.push_back(3);//Printfor(vector::const_iteratori=x.begin();i!=x.en

c++ - 如何有效地删除 vector 中的重复元素

我有vectordata;//Iholdsomeusernamesinit在那个vector中,我有重复的元素,所以我想删除这个/这些元素。是否有任何算法或库函数来删除重复的元素?ex:Indata;abba,abraham,edie,Abba,edieAfteroperation;abba,abraham,edie,Abba 最佳答案 如果您可以对容器中的元素进行排序,那么直接且相对有效的解决方案是:std::sort(data.begin(),data.end());data.erase(std::unique(data.beg

c++ - 如何在 C++ 中做集合 vector ?

我可以做一组简单的数组:set*words=newset[10]我如何做一组vector?这会导致编译器错误:vector>v.谢谢解答! 最佳答案 如果vector>v正是你所得到的(我希望你剪切和粘贴),你遇到了C++的一个烦人的小特性。那些>>看起来像两个模板的两个右尖括号。对于编译器来说,它们看起来像是右移运算符。将它们更改为>>中间有一个空格。幸运的是,今年应该批准的C++标准正在解决这个问题。不幸的是,您现在没有使用符合C++11的编译器。 关于c++-如何在C++中做集合v

c++ - C++ 中是否有标准的 3d vector 类

在一个现有的项目中,我看到一个Vector_3d类,模板化,具有vector的常用操作(在代数意义上)。经过剖析,我注意到大量的时间花在了这门课上。我想知道在C++中是否有像3dvector这样的基本概念的众所周知的实现。事实上,使用vector的良好实现可能比尝试优化这个vector更容易。编辑:这是在某些对象的几何表示的上下文中。但它独立于任何可视化。我会看看是否有办法避免过于频繁地调用各种方法。我将查看建议的软件包。 最佳答案 3dvector类没有太多改进空间(基本上,点积/叉积相当容易,矩阵乘法也是如此)。如果在该类(cl