首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >std::vector<double>的有效子集

std::vector<double>的有效子集
EN

Stack Overflow用户
提问于 2018-09-13 21:49:39
回答 2查看 124关注 0票数 1

假设我们在std::vector<double>中有一组双精度数。让我们称它为data。现在我想创建一个新的std::vector,它通过一个方法subvectordata的一个(已排序的)子集组成,例如,让data = [0,4,3,5,5,7]和我想要给我的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::vector<int> indices(3);
indices[0] = 1;
indices[1] = 2;
indices[2] = 4;
std::vector<double> subdata = data.subvector(indices);

结果应该是subdata = [4,3,5]。当然,我可以通过简单地复制data的值来实现这一点,但我真正想要的是,如果我在subdata中更改了值,它们在data中也会更改,也就是说,如果我这样做,subdata[2]=-1就是想要那个data = [0,4,3,5,-1,7]

所以,我必须做一些事情,比如“记住”data中的指针。我尝试了几个选项,将&*放在这里和那里,但是我不能得到想要的结果。

EN

回答 2

Stack Overflow用户

发布于 2018-09-13 22:36:00

存储指向项目的指针有点危险,因为在追加项目时,向量的内部缓冲区可能会(自动)被替换,然后这些指针就会悬空。

但您可以存储指向向量本身的指针或引用,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <vector>
#include <initializer_list>
using namespace std;

class Subdata
{
    vector<int>&        m_data;
    const vector<int>   m_indices;

public:
    auto operator[]( const int i )
        -> int&
    { return m_data[m_indices[i]]; }

    Subdata( vector<int>&  data, const initializer_list<int>& indices ):
        m_data( data ),
        m_indices( indices.begin(), indices.end() )
    {}
};

#include <iostream>
auto main()
    -> int
{
    vector<int> data = {0, 4, 3, 5, 5, 7};
    Subdata subdata( data, {1, 2, 4} );
    subdata[2] = -1;
    for( const int v : data ) { cout << v << ' '; } cout << endl;
}
票数 2
EN

Stack Overflow用户

发布于 2018-09-13 21:57:26

我真正想要的是,如果我更改子数据中的值,它们也会改变数据中的值,也就是说,如果我真的想要那个data = [0,4,3,5,-1,7],那么它们也会改变。

为此,您需要将指向成员的指针存储在data中。它们可以是原始指针(int*)或迭代器(std::vector<int>::iterator)。

然而,存储指针是有风险的。它们可以通过修改data来使其失效。更安全的方法是只使用索引,并通过使用索引来获取/设置data元素的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data[indices[0]] = <some value>; // Set the value in data
int x = data[indices[1]];        // Get the value from data

由于std::vector是一个随机访问容器,因此访问data元素的成本不会影响性能,如果需要考虑的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52322268

复制
相关文章
std::vector初始化[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/29
1.4K0
从 C++ STD::VECTOR的RESIZE和RESERVE看VECTOR的源码实现
https://www.cnblogs.com/yocichen/p/10574819.html https://www.kancloud.cn/digest/stl-sources/177267
早起的鸟儿有虫吃
2022/01/20
1.7K0
从 C++ STD::VECTOR的RESIZE和RESERVE看VECTOR的源码实现
std::vector find_vectornator工具使用
vector本身是没有find这一方法,其find是依靠algorithm来实现的。
全栈程序员站长
2022/09/27
3290
LeetCode 1452. 收藏清单(std::includes判断子集)
给你一个数组 favoriteCompanies ,其中 favoriteCompanies[i] 是第 i 名用户收藏的公司清单(下标从 0 开始)。
Michael阿明
2020/07/13
4340
C++ std::vector元素的内存分配问题
来看一个问题: 在使用C++ STL的vector时,下面三种写法有什么不同呢?其内存分配是怎么样的呢?
卡尔曼和玻尔兹曼谁曼
2019/01/22
3.5K0
C++ std::vector元素的内存分配问题
动态数组和C++ std::vector详解
std::vector是C++的默认动态数组,其与array最大的区别在于vector的数组是动态的,即其大小可以在运行时更改。std::vector是封装动态数组的顺序容器,且该容器中元素的存取是连续的。
艰默
2023/09/05
6480
动态数组和C++ std::vector详解
C++ std::vector元素的内存分配问题(补充)
在上篇博文C++ std::vector元素的内存分配问题中我们已经明确了使用std::vector容器时元素在内存中的创建情况。 所以,我个人觉得使用std::vector<T> vec;这种类型的最省时省力。 我们还是看原来的例子:
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.8K0
gdb打印vector(亲测有效)
最新在使用gdb调试c++代码的时候,发现无法使用print命令直接打印vector对象,在网上查阅了很多资料之后,发现都是这么说的: 1)打印整个vector (gdb) p *(myVector._M_impl._M_start)@myVector.size() 2)打印第N个成员 (gdb) p *(myVector._M_impl._M_start)@N 初看这两个命令就觉得有点奇怪,myVector.size()本质应该也是返回一个整数,如何区分打印整个vector和第N个呢?果然,在实际测试过程中,我们发现如下问题: 1)无法直接使用size()命令,如下所示:
skyyws
2022/05/20
2K0
gdb打印vector(亲测有效)
C++ std::vector::resize() 方法解析(菜鸟看了秒懂)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
acoolgiser
2019/11/12
64.3K0
std::vector扩容机制,.按1.5倍取整扩容,如下。
#include <iostream> #include <vector> using namespace std; /* * 结论: * capacity = 1, newcapacity = 2; * capacity > 1, newcapacity = (int)(capacity * 1.5); */ int main(){ int cap = -1; vector<int> ints; for(int i = 0;i<1000000;i++){
forxtz
2020/10/10
7040
PCL采样一致性算法
在计算机视觉领域广泛的使用各种不同的采样一致性参数估计算法用于排除错误的样本,样本不同对应的应用不同,例如剔除错误的配准点对,分割出处在模型上的点集,PCL中以随机采样一致性算法(RANSAC)为核心,同时实现了五种类似与随机采样一致形算法的随机参数估计算法,例如随机采样一致性算法(RANSAC)最大似然一致性算法(MLESAC),最小中值方差一致性算法(LMEDS)等,所有估计参数算法都符合一致性原则。在PCL中设计的采样一致性算法的应用主要就是对点云进行分割,根据设定的不同的几个模型,估计对应的几何参数模型的参数,在一定容许的范围内分割出在模型上的点云。
点云PCL博主
2019/07/31
1.9K0
PCL采样一致性算法
std::function与std::bind
一、背景介绍: 函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器,他们配合起来能够很好的替代函数指针。
灰子学技术
2022/01/18
9410
c++中的std::stod, stCPP程序说明std::stod():stof, std::stold
如果未执行转换,则会引发invalid_argument异常。如果读取的值超出双精度的可表示值范围,则会引发out_of_range异常。无效的 idx 会导致未定义的行为。
鲸落c
2022/12/14
3K0
C++11异步编程(std::async, std::future, std::packaged_task, std::promise)
       std::async是一个函数模板,会启动一个异步任务,最终返回一个std::future对象。在之前我们都是通过thread去创建一个子线程,但是如果我们要得到这个子线程所返回的结果,那么可能就需要用全局变量或者引用的方法来得到结果,这样或多或少都会不太方便,那么async这个函数就可以将得到的结果保存在future中,然后通过future来获取想要得到的结果。async比起thread来说可以对线程的创建又有了更好的控制,比如可以延迟创建。下面先介绍一下std::future, std::packaged_task, std::promise。
Ch_Zaqdt
2020/02/15
16.1K0
子集
给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。
WindRunnerMax
2020/09/22
5200
[Leetcode][python]Subsets/Subsets II/子集/子集 II
参考: https://shenjie1993.gitbooks.io/leetcode-python/078%20Subsets.html 举个例子,集合[1]有[[],[1]]两个子集,当向其中添加一个元素时,[1,2]有[[],[1],[2],[1,2]]四个子集,可以看出来,在新添加一个元素的时候,是在原来子集的基础上,添加原子集中所有元素加上新元素的总集合。为了每个子集中的元素都是不降序的,要先把所有元素都排序。
蛮三刀酱
2019/03/26
1.1K0
【python-leetcode90-子集】子集Ⅱ
输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
西西嘛呦
2020/08/26
7200
vector不是模板_vector的实现
vetcor顾名思义就是一个向量的容器,该容器中的每个元素都属于同一个类型,有点类似于数组,vetor容器与数组的不同之处就在于,它具有“动态”的属性,举例来说,如果定义了一个vector容量为10,当你添加第十一个元素时,他会自己找一篇新的足够大领土(内存),然后搬家(把旧址复制过去)。而数组同志显然就是比较死板,在定义时有多大,实际也就有多大。vector容器的常规操作有:
全栈程序员站长
2022/09/23
6480
如何优雅的使用 std::variant 与 std::optional
std::variant与std::optional是c++17加入的新容器,variant主要是为了提供更安全的union, 而optional除了存取T类型本身外, 还提供了一个额外的表达optional是否被设置值的状态.
fangfang
2021/10/29
3.8K0
理解std::move和std::forward
std::move和std::forward只是执行转换的函数(确切的说应该是函数模板)。std::move无条件的将它的参数转换成一个右值,而std::forward当特定的条件满足时,才会执行它的转换。这就是它们本来的样子.这样的解释产生了一些新问题,但是,基本上就是这么一回事。
杨永贞
2022/06/08
1.8K0
理解std::move和std::forward

相似问题

将std::vector<std::vector<std::string>>转换为std::vector<std::vector<double>>

35

将std::vector<boost::optional<double>>转换为std::vector<double>

20

std::function<double(std::vector<double>)回调

11

并行赋值给std::vector<std::vector<double>>

13

错误:对'Processus<std::vector<double> >::minmax(const std::vector<double>&,std::vector<double>&) const‘>调用没有匹配函数

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文