यह देखते हुए हमारे पास:

नमूना कोड A:

struct parameter
{
    string name, value;
};

ostream& operator<<(ostream& out, const parameter& p)
{
    return out << p.name << "=" << p.value;
}

नमूना कोड B:

auto seq = {
   parameter{ "language", "En" },
   parameter{ "q", "search+term" }
};

vector<string> tmp;
transform(begin(seq), end(seq), std::back_inserter(tmp),
    [](const auto& p) {
        ostringstream out;
        out << p;
        return out.str();
    });
auto result = boost::algorithm::join(tmp, "&");

क्या कोई तरीका है नमूना कोड B अधिक मुहावरेदार? मैं tmp की गणना करते समय tmp के उपयोग से बचने की कोशिश कर रहा हूं।

प्रारंभ में मैंने seq पर boost::algorithm::join को सीधे कॉल करने की कोशिश की (क्योंकि यह काम नहीं करता है, क्योंकि केवल पात्रों के अनुक्रमों पर जुड़ने वाले तत्वों के रूप में काम करता है)।

मैं एक एकल ostringstream और फोरगो boost::algorithm::join का भी पूरी तरह से उपयोग कर सकता हूं (लेकिन यह अतिरिक्त &) को जोड़ देगा, या तत्वों की संख्या पर पुनरावृति करेगा, और अंत में एक अतिरिक्त एम्परसेंड को स्पष्ट रूप से लागू करने से बचना होगा। , या मेरे स्वयं के शुतुरमुर्ग इटरेटर को परिभाषित करते हैं (लेकिन यह कई कोड लिखने के लिए है))।

धन्यवाद

1
utnapistim 4 पद 2015, 00:18

2 जवाब

सबसे बढ़िया उत्तर

कुछ और मुहावरेदार के लिए, आप boost::adaptors::transformed

std::vector<parameter> seq = {{"language", "En"}, {"q", "search+term"}};
auto result = boost::algorithm::join(seq | 
   boost::adaptors::transformed([](parameter const &p){return p.name + "=" + p.value;}), 
   "&");

लाइव डेमो

कोई अस्थायी वेक्टर, कोई महंगी स्ट्रिंग-स्ट्रीम नहीं।

0
101010 3 पद 2015, 21:48

अगर मैंने इसे सही समझा, और std :: ट्रांस्फ़ॉर्म करने के लिए लापता तर्क insert_iterator tmp है, तो ऐसा करने का सबसे आसान तरीका (और सबसे तेज़!) कुछ इस प्रकार है:

std::ostringstream out;
for (auto&& item : seq)
     out << item << "&";
std::string str = out.str();
if (str.size() > 0)
   str.resize(str.size() - 1);

बदसूरत लैम्ब्डा सिंटैक्स के साथ दृढ़ रूपांतरण का उपयोग करने की आवश्यकता नहीं है, और केवल उस पर जुड़ने के लिए कॉल करने के लिए एक अस्थायी वेक्टर बनाने की आवश्यकता नहीं है, और फिर से आवंटित करें।

0
SergeyA 3 पद 2015, 21:31