2011-04-11 38 views
0

我有2個矢量兩者的不同類型的即數據在載體

1. std::vector<project3::Vertex<VertexType, EdgeType>> Vertice2; //Contains a list of Vertices 
2. std::vector<std::string>temp12; 

我的要求是我要存儲從Vertice2所有數據temp12。試了很多不同的方法,但得到錯誤。即使類型鑄造沒有爲我工作。

最新我試圖是temp.assign(g1.Vertice2.begin(), g1.Vertice2.end());

Error: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1 from 'project3::Vertex<VertexType,EdgeType>' to 'const std::basic_string<_Elem,_Traits,_Ax> &' c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory 208 1 Project_3_Revised 
+1

有沒有方法可以將'Vertex'類型的對象轉換爲字符串? – 2011-04-11 15:39:15

+3

他們是不同的*不兼容*類型,你期望什麼?如果你的'Vertex'類支持一個'string'轉換操作符,你將會得到這個工作的唯一方法。 – Nim 2011-04-11 15:39:19

+1

'project3 :: Vertex '和'std :: string'之間的關係是什麼?也就是說,前者如何被轉化爲後者? – ildjarn 2011-04-11 15:39:22

回答

6

你有你想在橙vector貯藏蘋果的vector。但蘋果不是橙子,這是你的基本問題。

要麼你需要做一個tempvector<Vertex...>,或者你需要每個Vertex對象轉換爲string,然後存儲所產生的string秒。如果您正在嘗試將頂點插入vector<string>而不進行轉換,請將其放棄。你不能也不應該嘗試這樣做。你正在試圖把戰艦放進一個鉛筆杯。

如果你選擇轉換,那麼使用std::transform以及你自己設計的轉換函數是一個非常簡單的方法。

Psudocode如下:

std::string ConvertVertexToString(const Vertex& vx) 
{ 
    std::stringstream ss; 
    ss << vx.prop_a << " " << vx.prop_b; 
    return ss.str(); 
} 

int main() 
{ 
    ... 

    std::transform(Vertice2.begin(), Vertice2.end(), back_inserter(temp12), &ConvertVertexToString); 

} 
1

C++不支持不同類型的任意分配的對象。在大多數情況下,鑄造工作也不會奏效,即使您強制執行工作(如<reinterpret_cast>),也不安全。

你最好的選擇是使用運算符重載和複製構造函數來明確定義你期待從對象中得到的複製行爲。例如,將頂點指定給字符串時,不清楚應該複製哪些數據元素。

2

C++不提供任何默認強制轉換爲std :: string。 C++的模板是強類型的,就像其他語言一樣。

您需要創建一個方法或函數來將project3:Vertex轉換爲std :: string。

一旦你有了,你可以使用C++的轉換函數。

std::transform(Vertice2.begin(), Vertice2.end(), temp12.begin(), my_function_to_make_strings);

+0

我強烈懷疑有人會希望'std :: back_inserter(temp12)'而不是'temp12.begin()',因爲沒有跡象表明'temp12'不是空的。 – ildjarn 2011-04-11 16:06:15

+0

如果使用'temp12.begin()','temp12'最好不要爲空。 'std :: back_inserter'是一般走的路。如果分析器在這裏顯示性能問題,我們發現至少對於簡單類型(包括'string'),在視覺工作室下,創建具有源矢量大小的'temp12',然後傳遞'temp12.begin()到'轉化',稍微快一點。 – 2011-04-11 16:10:47

+0

@James Kanze:你用過VC++ 2010嗎?我懷疑在任何具有右值引用支持的編譯器中,std :: back_inserter會更快。 – ildjarn 2011-04-11 16:17:41

1

你的基本問題是,你有 project3::Vertex<VertexType, EdgeType>,你想 std::string。那麼你如何將一個轉換爲另一個呢?

轉換爲字符串 (std::string或其他)的通常解決方案是過載運算符<<。所以 你需要先定義一個函數

std::ostream& 
operator<<(std::ostream& dest, 
      project3::Vertex<VertexType, EdgeType> const& value) 

這將決定你的數據看,當轉換爲 串等。一旦你有了,就像這樣:

std::transform(
    Vertice2.begin(), Vertice2.end(), 
    std::back_inserter(temp12), 
    (std::string (*)(
     project3::Vertex<VertexType, EdgeType> const&)) boost::lexical_cast); 

應該做的伎倆。