2014-02-12 96 views
1

我想這個問題是建立在C++ convert vector<int> to vector<double>二維矢量類型轉換

我想投一個int類型的二維矢量(存儲在一個對象)到double類型的二維矢量。根據我提供的SO鏈接,

std::vector<int> intvec; 
std::vector<double> doubvec(intvec.begin(),intvec.end()); 

應該轉換原始矢量(它確實)。

那麼,爲什麼下面的代碼不工作?

std::vector<std::vector<double>> rotmat(Mesh.matrix.begin(),Mesh.matrix.end()); 

我可以做下面就好了行了,所以我知道有沒有別的錯誤。我錯過了什麼?

std::vector<double> dubvec(Mesh.matrix[0].begin(), Mesh.matrix[0].end()); 

網被定義爲:

class MeshOut 
{ 
public: 

MeshOut(); 



MeshOut(vector < vector <int>>, vector < vector <int>>, int, int, double, int, bool); 

vector<vector<int>> matrix; 
vector<vector<int>> lv_mat; 
int shortNum; 
int SourceNum; 
double smallestMeshSize; 
int factor; 
bool Fine; 
.... 

我請Meshout網(X,Y,Z,I,J,K,L);在代碼中。

+0

感謝Ypnos爲第一個問題的答案,但這引發了另一個問題:有沒有辦法做到這一點沒有循環? – user1558168

+0

請貼出「Mesh.matrix」聲明的內容。 – PaulMcKenzie

+2

要做到這一點沒有明確的循環,你可以使用for_each()和必要的函子。 – PaulMcKenzie

回答

1

雖然有原始intdouble類型之間的隱式轉換的規則,有std::vector<int>std::vector<double>之間非。

事實上,從類層次結構的角度來看,這兩種類型之間沒有關係。

+0

啊我明白了。那麼有沒有辦法做到這一點沒有循環? – user1558168

0

簡短的回答:使用一個循環,並得到它;-P

龍回答:你能避免循環,如果你去好了你的方式這樣做。

您正在使用的vector構造函數採用一對迭代的:因爲它遍歷,它基本上填充vector與連續element_type(*iterator) S,所以element_type需要從一個iterator的反引用價值構建。爲了構造一個vector<vector<double>>,迭代器需要產生的值可以隱含地構造,其中vector<double>可以是。每cppreference vector docs,潛在有用的構造函數爲:

  • vector(const vector&)

  • vector(vector&&)

  • vector(std::initializer_list<T> init, const Allocator& = Allocator())

其中,前兩個需要預先存在vector<double>對象,但最後一點更有意思。由於您的Mesh是用戶定義的類型,因此您可以創建一個迭代器類型,如果解除引用後會生成std::initializer_list<double>對象vector<int>.matrix,則可以支持您嘗試的vector<vector<double>>構造語法。那麼std::initializer_list<T>就是有效的臨時對象,可能無法進行優化,但如果在使用單個顯式循環後複製std::vector<double>,情況也是如此。如果你真的關心的效率,配置文件,並與嵌套循環使用reservepush_back ....