如何通过两个STL向量元素添加元素?

现在的问题是相当愚蠢的,但我需要做一个非常有效的方式 - 它会通过一个反复在我的代码来执行。 我有一个函数,返回一个载体,我不得不通过元素返回的值添加到另一个向量元素。 非常简单:

vector<double> result; vector<double> result_temp for(int i=0; i< 10; i++) result_temp.push_back(i); result += result_temp //I would like to do something like that. for(int i =0; i< result_temp.size();i++)result[i] += result_temp[i]; //this give me segfault

我想要做的数学运算是

U [i] = U [I] + V [I]对所有的i

可以做些什么?

谢谢

编辑:增加了一个简单的初始化,因为这是不是问题的关键。 应该如何导致初始化?

--------------解决方案-------------

如果你想增加一条vector到另一个,你可以使用类似于下面的东西。 这些都是从我的实用工具库一-二operator+=重载std::vector :一是追加一个元素的vector ,另外附加一个完整的vector

template <typename T>
std::vector<T>& operator+=(std::vector<T>& a, const std::vector<T>& b)
{
a.insert(a.end(), b.begin(), b.end());
return a;
}

template <typename T>
std::vector<T>& operator+=(std::vector<T>& aVector, const T& aObject)
{
aVector.push_back(aObject);
return aVector;
}

如果您正试图执行一个总和(即,创建一个新的vector含有其他两个元素之和vector S),你可以使用类似以下内容:

#include <algorithm>
#include <functional>

template <typename T>
std::vector<T> operator+(const std::vector<T>& a, const std::vector<T>& b)
{
assert(a.size() == b.size());

std::vector<T> result;
result.reserve(a.size());

std::transform(a.begin(), a.end(), b.begin(),
std::back_inserter(result), std::plus<T>());
return result;
}

你可以同样实现一个operator+=超载。

它确保看起来像问题正在存取的值result不存在的。 tzaman说明了如何初始化结果10个元素,每个的值是0。

现在,你需要调用transform功能(从<算法>),应用plus函数对象(从<功能>):

std::transform(result.begin(), result.end(), result_temp.begin(),
result.begin(), std::plus<double>());

这个遍历resultresult_temp采用plus ,增加了一倍,并写总和回result

需要初始化result为全零第一; 只是声明变量实际上不分配任何元素。

尝试这个:

vector<double> result(10); // default-initialize to 10 elements
vector<double> result_temp;
for(int i=0; i< 10; i++)
result_temp.push_back(i);

for(int i =0; i< result_temp.size();i++)
result[i] += result_temp[i];

如果您的代码段错误那么这是一个正确的问题,而不是一个效率的问题。

为了实现“U [i] = U [I] + V [I]所有我”,我会做你做基本上是:

assert(u.size() == v.size()); // will fail with your initialization code, since
// your "result" has size 0, not size 10.
// perhaps do u.resize(v.size());
for (size_t i = 0; i < u.size(); ++i) {
u[i] += v[i];
}

如果你真的关心你的程序的性能(也就是你写一个基本的版本,它这么慢,你的计划是失败的一些要求,你已经证明,这正是大部分时间在拍摄代码) ,那么你可以尝试:

  • 对很多在你的编译器优化的切换(其实,我通常这样做默认情况下,即使不存在性能问题)
  • 使用迭代器,而不是指数(很少做太大的区别,但它是很容易比较两个)
  • 展开循环位(可以做一个有价值的速度差,但是这要具体情况相当敏感,并鼓励编码错误)。
  • 寻找特定平台的SIMD指令,而不是C ++。 然后使用嵌入式汇编程序或编译器内在函数有关说明。

不过,你有没有生意担心表现在你的代码是正确的;-)。 “让它工作,使之正确,使之快”是一个合理的座右铭,但往往你不需要尽量去当第3步。

std::valarray实际上具有完全相同的operator+= ,你想要的。 在您与valarrays替换所有的载体,要知道,这并不一定意味着它的任何“更有效率”不是一个简单的循环-我不知道实施者多么认真地对待valarray 您可以随时看看你实现的源。 我也不知道为什么的多数据运算功能valarray并没有定义为部分vector ,但通常一个原因。

我和@詹姆斯McNellis -这段代码似乎是正确的,只要resultresult_temp长度相同。

此外-你为什么要宣布result ,但使用变量result_v -是代码是如何实际写入? 如果是这样,这是一个问题

该代码似乎不错,但我的第一个倾向是将改变任何代码填充向量值添加到值在第一载体采取一个参考第一载体,直接添加到它,而不是创建一个新的载体这被退回。 这只是效率不高。

如果你不能改变那样的功能,也许你可以改变它,以便它需要一个参考,它会清除一个载体,然后将值插入,这样你是不是抄袭围绕载体。 这可以是昂贵的,如果你这样做了。

另一个鸡蛋里挑骨头,如果你试图让这个尽可能快,你应该使用预增量迭代器,而不是后增。 临时的后递增创建时重载运算处理,而不是内置的类型不能被优化掉。 所以,你不断创建和销毁一个临时的环路编辑的每一个迭代正如有人指出,在评论中,你使用的索引位置,而不是迭代器(我显然没有给予足够的重视),所以建议此位并没有真正适用于此。 然而,在情况下,你使用的是迭代器,它仍然是有效的。

除此之外,如果你想添加的所有两个向量togther的元素,你有什么大概是高效的解决方案,你会得到。 有更好的方法,如果你关心的是将一个向量的元素到另一个,但如果你只是将自己的价值观在一起,你有什么好看的东西。 我预计使用任何STL算法将充其量只是快和慢的很可能是由于额外的函数调用,但你可能要配置文件是可以肯定的。

乔恩·里德的回答一个具体的例子:

std::array<double,3> a = {1, 2, 3};
std::array<double,3> b = {4, 5, 6};
std::transform(a.begin( ), a.end( ), b.begin( ), a.begin( ),std::plus<double>( ));
ASSERT_TRUE(a[0] == 5);
ASSERT_TRUE(a[1] == 7);
ASSERT_TRUE(a[2] == 9);

分类:C# 时间:2012-01-01 人气:0
本文关键词: C#,STL,矢量
分享到:

相关文章

  • 删除重复的STL载体,STL矢量 2014-11-06

    我有一个包含整数值STL矢量的STL向量. 一些内部向量复制但他们的元素的顺序是不一样的. 现在,我想获得矢量的矢量,而无需任何重复内的载体. 我已经看到了下面的方法: std::vector<std::vector<int>> myVec; std::sort(myVec.begin(), myVec.end()); myVec.erase(std::unique(myVec.begin(), myVec.end()), myVec.end()); 问题是,我想eleminate

  • 实例化一个新的STL矢量 2014-11-14

    我有一个情况我有一个指针STL矢量 所以像 vector<MyType*>* myvector; 我有这个指针设置为NULL的构造函数,然后延迟加载,当财产被触及. 我怎么能实例化向量的一个新的实例? --------------解决方案------------- 我有这个指针设置为NULL的构造函数,然后延迟加载,当财产被触及. 我怎么能实例化向量的一个新的实例? 我不知道我理解你的所有道路. 为什么不干脆离开矢量空,并设置一个布尔值,表示该属性是否被加载与否? 另外,您也可以使用boost

  • STL矢量控制性能 2012-03-09

    STL向量类存储使用每个我所说的push_back一次拷贝构造函数的对象的副本. 那岂不是拖慢程序? 我可以有一个自定义的LinkedList一种类其中涉及对象指针. 虽然它不会有STL的一些优点,但仍应该会更快. 请参阅下面的代码: #include <vector> #include <iostream> #include <cstring> using namespace std; class myclass { public: char* text; mycla

  • 快速的方式来“备份”(副本)自定义对象的大型STL矢量 2012-06-02

    我使用STL向量来存储自定义对象的一个​​大的(〜10 ^ 6)号(的sizeof()给出了其中一个对象368字节). 我的程序的结构要求我做这个载体的频繁备份副本在某一步的更改可能需要在一定条件下进行展开. 大致是这样看起来像 std::vector<myClass> vecA( largeNumber ); std::vector<myClass> vecB; do { vecB = vecA; //do lots of stuff to vecA if ( restoreBa

  • STL矢量VS列表:最有效的图形邻接表? 2012-06-14

    列出消耗了大量的时间在当pushing_back分配内存. 另一方面,载体具有需要调整大小时复制它们的元素. 该容器,因此,最有效的存储邻接表? --------------解决方案------------- 我不认为这是可以绝对肯定回答. 不过,我估计有至少90%的机会,一个矢量会做的更好的. 邻接表实际上倾向于支持向量比许多应用程序更多,因为元素的邻接表的顺序不(正常)的事情. 这意味着当您添加元素,它通常到容器的最后,当你删除一个元素,可以首先将其交换到容器的结束,所以你永远只能添加或删除

  • 插入STL矢量 2012-11-24

    用C ++ STL向量我们正在建设N个元素的载体,由于某种原因,我们选择在载体的前面插入. 在一个载体的前每一个元素插入由1.这导致在(1 + 2 + 3 + ... + N)的矢量元素的总体偏移,它是(N / 2)×(N强制所有存在的元素的移+1)转移. 我的问题是作者怎么来了(1 + 2 + 3 + ... N),我认为这应该是1 + 1 + 1..1因为我们是在一个位置移动一个元素得到在开始是空的? 谢谢! --------------解决方案------------- 从[vector.

  • 转换STL String和STL矢量成void *吗? 2012-11-25

    香港专业教育学院得到了一些C ++代码,我们使用序列化任意数据,并将其存储到一个专门的图像格式,元数据. 不管怎么说,它把它作为一个void *. 我可以做一个简单的memcpy? 还是有更好的方法来做到这一点? --------------解决方案------------- 性病::字符串你可以使用c_str()获得字符*指向内部字符串. 性病::向量的标准规定的元素是连续在内存中,这样你就可以访问指向数据的开头&V [0]. 当然,你要小心这些,因为你基本上交给图书馆使用的是一个指向对象的内

  • SWIG包装C ++为Python:翻译字符串列表,以STL字符串的STL矢量 2012-12-12

    我想换用痛饮C ++函数,它接受STL的字符串作为输入参数向量: #include <iostream> #include <string> #include <vector> using namespace std; void print_function(vector<string> strs) { for (unsigned int i=0; i < strs.size(); i++) cout << strs[i] <<

  • STL“矢量过长” 2012-12-24

    我读在那里有没有通过的std ::向量C ++编译器的最大大小强加的限制答案. 我试图使用矢量为了一个目的,并需要有10 ^ 19个项目. typedef struct{ unsigned long price, weight; }product; //inside main unsigned long long n = 930033404565174954; vector<product> psorted(n); 该方案打破的最后声明. 如果我尝试resize(n)而不是与初始化n有消息随后

  • C ++结构调整和STL矢量 2013-01-12

    我有一个传统的数据结构,这是672个字节长. 这些结构被存储在一个文件中,顺序地,我需要读取它们. 虽然我能读懂他们在一个接一个,这将是很好的做到这一点: // I know in advance how many structs to read in vector<MyStruct> bunchOfStructs; bunchOfStructs.resize(numberOfStructs); ifstream ifs; ifs.open("file.dat"); if

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.360 (s). 10 q(s)