2014-03-30 47 views
1

任何簡單的方法重載各種算術運算符(+-*/+=,...)爲std::arraystd::vector?算術運算是成員明智的。類似以下內容任何簡單的方法來執行std :: array和std :: vector的算術運算?

template<class ContainerT, class opT> 
ContainerT operator opT(ContainerT const& a, ContainerT const& b) 
{ 
    .... 
} 

template<class ContainerT, class opT> 
ContainerT operator opT=(ContainerT const& a, ContainerT const& b) 
{ 
    .... 
} 
+1

好吧,我現在可以告訴你,你必須至少重載一次它們。儘管每個運營商只有一個重載應該是可能的。 –

+0

你的意思是你想爲每個元素執行一個操作符? – Ben

+1

容器應該是數字嗎? 1xN或Nx1矩陣?無論如何,除非你使用別人的東西,否則它不會比編寫代碼更容易。 – WhozCraig

回答

4
std::vector<int> input1(..); 
std::vector<int> input2(..); 
std::vector<int> output(input1.size()); 
std::transform (input1.begin(), input1.end(), input2.begin(), output.begin(), std::plus<int>()); 

還有其他的功能可供選擇,您可以隨時製作自己的或使用拉姆達。

1

你想要這個嗎?

#include <iostream> // std::cout 
#include <iterator> // std::ostream_iterator, std::back_inserter 
#include <algorithm> // std::copy, std::transform 
#include <vector> 
#include <deque> 
#include <list> 

int main() 
{ 
    std::vector<int> vt = { 1, 2, 3, 4, 5 }; 
    std::deque<int> de = { 3, 4, 5, 6, 7 }; 
    std::list<int> out; 

    std::transform(vt.begin(), vt.end(), de.begin(), std::back_inserter(out), 
     [](int a, int b) { return a + b; }); 

    std::copy(out.begin(), out.end(), std::ostream_iterator<int>(std::cout, "\n")); 
} 

輸出是:

4 
6 
8 
10 
12 

我認爲運營商超載STL容器,如std::vector不好。相反,您可以使用std::valarray

+0

這與「std :: transform」有什麼不同? –

+0

@NeilKirk'std :: transform'的輸入迭代器範圍是1,但是我的'do_operation'可以執行兩個範圍。 – ikh

+0

所以'std :: transform'可以重載。 –

相關問題