我想創建std::string
,其中包含由某個分隔符(可以來自STL或Boost)分隔的第一個元素std::map<std::string, std::string>
。 有沒有比循環更好的解決方案(一行)?像boost::algorithm::join
爲std::vector<std::string>
。std :: map <string,string>轉換爲字符串(第一個值)
回答
這可以使用優雅Boost.Range的map_keys
和升壓來進行.StringAlgo的join
:
std::string get_keys(const std::map<std::string, std::string>& map) {
return boost::algorithm::join(
map | boost::adaptors::map_keys,
", ");
}
http://www.boost.org/doc/libs/1_61_0/boost/algorithm/string/join.hpp
你的算法應該是這樣的:
std::string get_keys(const std::map<std::string, std::string>& map) {
std::string result;
std::for_each(map.cbegin(),
map.cend(),
[&result](const decltype(map)::value_type& p) {
result += p.first;
result += ", ";
});
// Erase the last ", " from the string, if present
if (result.size() > 0) {
result.erase(result.size() - 2, 2);
}
return result;
}
從本質上講,你必須循環在地圖中的每個元素,並將其添加到字符串。複雜度爲O(N)與N地圖中元素的數量。
您可以改進算法在字符串結果上應用reserve
的性能。
如果你知道字符串鍵的平均長度時,您可以初始化變量:
std::string result;
result.reserve(map.size() * AVG_LENGTH_STR_KEY);
這會提高很多循環中的operator+=
操作。
作爲M.M.正確指出,你可以使用boost::range
這個(我加入了boost::string
)。
如果您的地圖是m
,則
std::vector<std::string> o;
boost::copy(m | boost::adaptors::map_keys, std::back_inserter(o));
boost::algorithm::join(o, ", ");
最後一行是結果。 (不幸的是,這需要巨大的數的頭文件。)
例
#include <boost/range/adaptor/map.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/assign.hpp>
#include <boost/algorithm/string/join.hpp>
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
int main()
{
std::map<std::string, std::string> m;
m["hello"] = "world";
m["goodbye"] = "now";
std::vector<std::string> o;
boost::copy(m | boost::adaptors::map_keys, std::back_inserter(o));
std::cout << boost::algorithm::join(o, ", ") << std::endl;
}
此輸出
$ ./a.out
goodbye, hello
$
如果你不想使用升壓,然後嘗試std::accumulate:
const std::string delimiter = "#";
const std::string result = std::accumulate(M.begin(), M.end(), std::string(),
[delimiter](const std::string& s, const std::pair<const std::string, std::string>& p) {
return s + (s.empty() ? std::string() : delimiter) + p.first;
});
在上面的代碼M
是一個std::map<std::string, std::string>
。
'M'的'value_type'是'pair
@Barry很棒的評論!謝謝。固定。 –
- 1. 如何將xml字符串轉換爲映射<String,String>
- 2. 轉換的std :: string到V8 ::字符串
- 3. 從std :: string獲取第一個字符
- 4. 將List <Map <String,Object >> row`的null轉換爲空字符串
- 5. C++循環std :: vector <std :: map <std :: string,std :: string>>
- 6. 轉換字符串[] []爲String []
- 7. 將字符串轉換爲列表<string>在一行中?
- 8. 如何將HashMap <String,Integer> param轉換爲Map <String,Object)
- 9. 如何將Json字符串轉換爲List <HashMap <String,String >>?
- 10. 將std :: string轉換爲c字符串數組
- 11. 字符串自動轉換爲const char *到的std :: string
- 12. #define字符串強制轉換爲LPCSTR或std :: string
- 13. 在C++中將std :: string轉換爲Unicode字符串
- 14. 將C風格的字符串轉換爲C++ std :: string
- 15. boost :: trim std :: vector中的每個字符串<std::string>
- 16. 將一個字符數組轉換爲std :: string以傳入std :: bitset seg fault
- 17. 無法從列表<map <string,object >>轉換爲列表<map <string,string >>
- 18. 轉換陣列<String>爲字符串,然後回到陣<String>
- 19. 如何將List [List [Map [String,String]]]轉換爲List [Map [String,String]]
- 20. 轉換一個char「」或換行符爲一個字符串
- 21. 將std :: string(保證數字)轉換爲無符號字符
- 22. 無法從字符串[]轉換爲String
- 23. 爲什麼map <string,string>接受int值作爲值?
- 24. 將std字符串轉換爲nsstring
- 25. BestPractice - 將字符串的第一個字符轉換爲小寫
- 26. 如何將IEnumerable <string>轉換爲一個逗號分隔的字符串?
- 27. 將Map [String,Double]轉換爲java.util.Map [String,java.lang.Double]
- 28. 我如何將IQueryable <string>轉換爲字符串數組?
- 29. 從HashSet <String>轉換爲字符串[]
- 30. 將列表<String>轉換爲Java中的字符串[]
現在還不清楚。假設你有一個包含兩個元素的地圖。你正在尋找的輸出是類似「key1:value1,key2:value2」? – Rerito
請參閱[如何從std :: map檢索所有鍵(或值)?](http://stackoverflow.com/questions/110157/how-to-retrieve-all-keys-or-values-from-a -stdmap),修改解決方案以附加到字符串 –
不,@Rerito。對於:「key1:value1,key2:value2」和逗號分隔符我想要:「key1,key2」。 – peter55555