是否可以使用 std:: basic _ string 作为 char * 的包装?

我有第三方库,它返回 strdup (和 wcsdup 函数分别在其中创建的 char * (和 wchar _ t *)。 我想避免在代码末尾手动调用 free。 是否可以为 std:: basic _ string 编写一个分配器,以便它能够处理这个库返回的 c 字符串?理想情况下,我根本不想分配任何新内存,也不想使用返回的内存块 (字符串应该是常量)。 ……

共4个回答, 标签: c++ c++11 memory-management stl
使用 std:: transform 和 std:: back_inserter 有效吗?

Cppreference 有以下示例代码std::transform [https://en.cppreference.com/w/cpp/algorithm/transform]: Std:: 向量序数; Std:: transform (s.begin (),s.end (),std:: back_inserter (序数), [] (无符号字符 c)-> std:: size_t {返回 c;}); 但它也说: > std::transform does not guarantee in-order application of unary_op or binary_op. To apply a function to a sequence in-order or to apply a function that modifies the elements of a sequence, use std::for_each。 这大概是为了允许并行实现。然而,第三个参数std::transform is a LegacyOutputIterator [https://en.cppreferenc ……

共4个回答,已解决, 标签: c++ stl language-lawyer c++17
为什么在 std:: set 上迭代比在 std:: vector 上迭代慢得多?

在优化性能关键代码时,我注意到迭代 std:: set 有点慢。 然后,我写了一个基准,并通过迭代器测试了向量上的迭代速度 (auto it : vector), iterating over a set by iterator, and iterating over a vector by index (int i = 0; i < vector.size(); ++i)。 容器的构造相同,有 1024 个随机整数。(当然,因为我们使用集合,所以每个 int 都是唯一的)。然后,对于每一次运行,我们都循环遍历容器,并将它们的 int 和长 int 相加。每次运行都有 1000 次迭代进行求和,测试平均运行超过 1000 次。 以下是我的结果: 迭代器测试向量 ✓ 最长时长: 0.012418 最短时长: 0.007971 平均时长: 0.008354 按指数测试向量 ✓ 最长时长: 0.002881 最短时长: 0.002094 平均时长: 0.002179 迭代器设置的测试 ✓ 最长时长: 0.021862 最短时长: 0.014278 平均时长: 0.014971 正如我们所看到的,迭代 ……

共4个回答,已解决, 标签: c++ c++11 stl
在 std:: vector 的末尾插入或回推?

下面的两种方法在将新元素插入到std::vector: 方法 1 向量 vec = {1}; Vec.Push _ back (2); Vec.Push _ back (3); Vec.Push_ back (4); Vec.Push_ back (5); 方法 2 向量 vec = {1}; Int arr [] = {2,3,4,5}; Vec.insert (std:: end (vec),std:: start (arr),std:: end (arr)); 就我个人而言方法 2因为它很好,简洁,一次插入数组中的所有新元素。但是在性能上有什么不同吗?毕竟,他们做同样的事情。不是吗? 更新 首先,我没有用所有元素初始化向量的原因是,在我的程序中,我根据一个条件添加了剩余的元素。 ……

共4个回答, 标签: c++ performance c++11 stl insert
当容器被复制到自己中时,STL 容器是否应该避免将元素复制到自己身上?

问题是关于自我分配。例如,将向量复制到自身中: Std:: 向量 vec (5,“你好”); Vec = vec; 上面的代码应该对字符串本身执行 5 次赋值操作,还是什么都不做?我的意思是,以下检查是否有效: Std:: 向量运算符 = (const std:: vector & rhs) { 如果 (这个 = = & rhs) {返回 * 此;} ... } 我正在研究我自己的实现std::variantClass (只是为了好玩),如果我应该在赋值运算符的开头添加一个自我赋值检查,或者我应该将包含的元素复制到自己中,我会感兴趣吗? 我知道这并不重要。你不应该创建一个利用复制到自身的事实的类。但是如果标准说了什么,我很感兴趣。 ……

共4个回答, 标签: c++ stl language-lawyer c++-standard-library
字符串使用 set_union

我有两个向量,我需要它们在第三个向量中的并集 (不指定第三个向量的大小) Std:: 向量 a = {"a","b"}; Std:: 向量 b = {"d","c"}; Std:: 向量 c; Std:: set _ union (a.begin () 、 a.end () 、 b.begin () 、 b.end () 、 c.begin ()); Std:: cout < ` 这将编译,但给出一个空输出。 ` ……

共3个回答,已解决, 标签: c++ algorithm sorting vector stl
元组统一初始化

今天,我遇到了一种情况,在这种情况下,我有一个元组向量,其中元组可能包含几个条目。现在,我想将我的元组向量转换为对象向量,这样元组的条目将与我的对象的统一初始化完全匹配。 下面的代码为我做了这项工作,但是有点笨拙。我问自己,如果元组与对象的统一初始化顺序完全匹配,是否有可能导出一个通用的解决方案来构造对象。 当要传递的参数数量增加时,这可能是一个非常理想的功能。 # 包括 # 包括 # 包括 # 包括 结构对象 { 字符串 s; I; 双 d; }; Int main () { Std:: 向量> 值 = {{"A",0,0。},{"B",1,1}}; Std:: 矢量 objs; Std:: 转换 (值。开始 (),值。结束 (),std:: back _ inserter (objs),[] (自动 v)-> 对象 { //如果元组增长,键入可能会变得乏味 返回 {std:: get <0> (v),std:: get <1> (v),std:: get <2> (v)}; //这是我想要的行为,但是我不知道 magic_wrapper 可能是什么 返回 magic_wrapper (v); ……

共3个回答,已解决, 标签: c++ stl stl-algorithm stdtuple uniform-initialization
迭代 std 的最有效方法是什么:: 向量和为什么?

就时空复杂性而言, 以下哪种方法是遍历 std 的最佳方式: 向量和为什么? 方法 1: for(std::vector::iterator it = v.begin(); it != v.end(); ++it) { /* std::cout << *it; ... */ } 方法 2: for(std::vector::size_type i = 0; i != v.size(); i++) { /* std::cout << v[i]; ... */ } 方法 3: for(size_t i = 0; i != v.size(); i++) { /* std::cout << v[i]; ... */ } 方法 4: for(auto const& value: a) { /* std::cout << value; ... */ ……

共3个回答, 标签: c++ performance stl iterator
C 标准是否保证插入关联容器失败不会修改右值引用参数?

# 包括 # 包括 # 包括 使用命名空间 std:: literals; Int main () { Auto coll = std:: 设置 {"hello" s}; Auto s = "hello" s; 插入 (std:: 移动); 断言 (“hello” s = = s);//总是可以吗? } C 标准是否保证插入关联容器失败不会修改右值引用参数? ……

共3个回答,已解决, 标签: c++ stl language-lawyer rvalue-reference pass-by-rvalue-reference
Std:: 元素构建到位的矢量构建

是否有可能构造一个初始大小的 std:: vector,并在适当的位置构造它的元素?我存储的类型不可复制,所以这不起作用,因为初始值是作为临时值构造的,并复制到元素中: # 包括 # 包括 # 包括 结构 A { A (int i = 0): i _ (i) {}; Int i _; Std:: unique_ptr p _;//不可复制 }; Int main () { 向量 v (10,1);//错误 } 这接近我试图实现的目标,也许这并不坏,但是我想知道是否有更清洁的方法: int main() { //std::vectorV (10,1);//错误 Std:: 向量 v; 五、储备 (10); 对于 (int i = 0; i <10; i) { 五、 emplace _ back (1); } }' 我只限于 c 11,但出于好奇,我对 c 17 解决方案也感兴趣。 ……

共3个回答,已解决, 标签: c++ c++11 stl
使用 c ++ 中的用户输入初始化数组大小的不同方法

我想知道在 c ++ 中执行以下代码段的一些替代方法。 int i; cin >> i; int arr[i]; 我最近开始研究有竞争力的编程, 并试图了解更多。 编辑: 对于那些关于这不是 cpp 的评论。它成功地编译与我在我的类中使用的生成文件, 它正在使用, gcc -std=c++11 -o a.exe main.cpp 并返回到控制台时, 我输入的长度为1 array length: 1 ……

共3个回答, 标签: c++ arrays c++11 gcc stl
&ldquo;由于函数调用,断言不应该修改它们的状态&rdquo; 是什么意思?

我在网上阅读了关于 C 的文章,发现了这样一句话 “由于函数调用,断言不应该修改它们的状态”。我不明白 “状态” 在这里是什么意思。有人能举例说明一下吗? ……

共3个回答, 标签: c++ c++11 stl predicate
如何为接受 stl 容器迭代器的函数提供函数签名?

我想写一个函数my_func that can be called as so, but does not care that v is a std::vector, it could be any STL container. A bit like std::for_each: Std:: 向量 v = {.}; My_func (v.begin (),v.end ()); 但是我不知道函数签名。 虚空 my_func (??? i1,i2 ???) { Std:: for _ each (i1,ii,.);//愚蠢的示例实现 } 我不擅长模板编程,所以即使看了std::for_each不是在帮助我 有没有简单的实现,或者模板 vars 会从根本上变得混乱? ……

共3个回答,已解决, 标签: c++ function templates stl c++14
在线性时间内找出排序向量中是否有一对加起来等于某个值

给定一个std::vector of distinct elements sorted in ascending order, I want to develop an algorithm that determines whether there are two elements in the collection whose sum is a certain value, sum。 我已经尝试了两种不同的方法,它们各自的权衡: 1. 我可以扫描整个向量,对于向量中的每个元素,应用二进制搜索 (std::lower_bound) on the vector for searching an element corresponding to the difference between sum和当前元素。这是一个不需要额外空间的 O (n log n) 时间解决方案。 2. 我可以遍历整个向量并填充一个std::unordered_set. Then, I scan the vector and, for each element, I look up in ……

共3个回答,已解决, 标签: c++ algorithm c++11 search stl
具有特定类型作为泛型参数的 STL 容器

有没有办法,我可以做一个函数,它接受一个特定类型的容器 (比如说std::string) 作为参数 Void foo (const std:: container & cont) { 对于 (std:: 字符串 val: cont) { Std:: cout <<val <<std:: endl; } } 并为每种类型的 stl 容器调用它作为输入?像上面一样? Std:: set strset; Std:: vector strvec; Std:: list strlist; Foo (strset); Foo (strvec); Foo (strlist); ……

共3个回答,已解决, 标签: c++ templates stl containers
计算加权平均值的 STL/ranges 算法

假设我有一个分数向量,其中分数是 结构等级 { Const int 的等级; Const int 的学分;//重量 }; 是否有 STL/range-v3 算法/算法使我能够做到这一点? 我知道我可以用std:: accumulate使用一些花哨的类型作为累加器 (记住重量的总和),但是如果存在的话,我正在寻找一个更简单的替代方案。 ……

共2个回答, 标签: c++ stl weighted-average range-v3
是否有很好的方法将 std:: minmax (a,b) 分配给 std:: tie (a,b)?

Std:: tie (a,b) = std:: minmax (a,b); 我认为这是直观的代码。干净易懂。太糟糕了,它没有按照预期工作std::minmax [https://en.cppreference.com/w/cpp/algorithm/minmax] templates for const&. If therefore the values are swapped inside the std::pair超过一个赋值将覆盖另一个值: Auto [a,b] = std:: make _ pair (7,5); Std:: tie (a,b) = std:: minmax (a,b); Std:: cout <a: <a <,b: <b <<'\ n'; > 甲: 5,乙: 5 这里的预期产量是a: 5, b: 7。 -------------------------------------------------------------------------------- 我认为这一点很重要,因为实现将函数应用于某些范围的转换函数需要直观的 lambda 表达式的这种语句。例 ……

共2个回答,已解决, 标签: c++ algorithm reference stl c++17
Std:: pair 会破坏其动态分配的对象吗?

例如,像std::vector destroy all of its elements that were addad to it by push_back(new T). Does std::pair does the same when you initialize it like { new T1, new T }? 我有这个问题是因为std::pair是一个不同于类容器的结构 (它并不意味着什么,但仍然)。我找不到任何关于它的信息。 编辑: 尽管我认为容器delete他们动态分配的元素,这是错误的。 ……

共2个回答,已解决, 标签: c++ stl
如何理解 vector pop _ back 实现?

我目前正在思考为什么 STL 以这种方式实现 vector pop _ back。为什么我们先移动结束指针前言,然后使用结束指针释放最后一个元素的空间? Void pop _ back () { -- _ M _ finish; 破坏 (_ m _ finish); } ……

共1个回答,已解决, 标签: c++ vector stl sgi
"Auto x = 向量<int>()" 和 "向量<int>x"</int> </int>之间的区别是什么?

我正在编写一些代码, 并有一个问题。auto x = vector();和之间的区别是什么 vector x; ?它们是都一样的, 还是与复杂性有一些不同? ……

共1个回答,已解决, 标签: c++ vector stl initialization