অন্যরা যেমন বলেছিল, ওপি কোডের সাথে প্রধান সমস্যাটি হ'ল অপারেটর +
সম্মিলিত হয় না const char *
; std::string
যদিও এটি সাথে কাজ করে ।
এখানে আরও একটি সমাধান যা সি ++ 11 ল্যাম্বডাস ব্যবহার করে for_each
এবং এটি সরবরাহ করার অনুমতি দেয়separator
স্ট্রিংগুলি পৃথক করার জন্য করতে :
#include <vector>
#include <algorithm>
#include <iterator>
#include <sstream>
string join(const string& separator,
const vector<string>& strings)
{
if (strings.empty())
return "";
if (strings.size() == 1)
return strings[0];
stringstream ss;
ss << strings[0];
auto aggregate = [&ss, &separator](const string& s) { ss << separator << s; };
for_each(begin(strings) + 1, end(strings), aggregate);
return ss.str();
}
ব্যবহার:
std::vector<std::string> strings { "a", "b", "c" };
std::string joinedStrings = join(", ", strings);
এটি কমপক্ষে আমার কম্পিউটারে একটি দ্রুত পরীক্ষার পরে, ভাল স্ক্রিন (রৈখিক) বলে মনে হচ্ছে; আমি লিখেছি একটি দ্রুত পরীক্ষা এখানে:
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <chrono>
using namespace std;
string join(const string& separator,
const vector<string>& strings)
{
if (strings.empty())
return "";
if (strings.size() == 1)
return strings[0];
stringstream ss;
ss << strings[0];
auto aggregate = [&ss, &separator](const string& s) { ss << separator << s; };
for_each(begin(strings) + 1, end(strings), aggregate);
return ss.str();
}
int main()
{
const int reps = 1000;
const string sep = ", ";
auto generator = [](){return "abcde";};
vector<string> strings10(10);
generate(begin(strings10), end(strings10), generator);
vector<string> strings100(100);
generate(begin(strings100), end(strings100), generator);
vector<string> strings1000(1000);
generate(begin(strings1000), end(strings1000), generator);
vector<string> strings10000(10000);
generate(begin(strings10000), end(strings10000), generator);
auto t1 = chrono::system_clock::now();
for(int i = 0; i<reps; ++i)
{
join(sep, strings10);
}
auto t2 = chrono::system_clock::now();
for(int i = 0; i<reps; ++i)
{
join(sep, strings100);
}
auto t3 = chrono::system_clock::now();
for(int i = 0; i<reps; ++i)
{
join(sep, strings1000);
}
auto t4 = chrono::system_clock::now();
for(int i = 0; i<reps; ++i)
{
join(sep, strings10000);
}
auto t5 = chrono::system_clock::now();
auto d1 = chrono::duration_cast<chrono::milliseconds>(t2 - t1);
auto d2 = chrono::duration_cast<chrono::milliseconds>(t3 - t2);
auto d3 = chrono::duration_cast<chrono::milliseconds>(t4 - t3);
auto d4 = chrono::duration_cast<chrono::milliseconds>(t5 - t4);
cout << "join(10) : " << d1.count() << endl;
cout << "join(100) : " << d2.count() << endl;
cout << "join(1000) : " << d3.count() << endl;
cout << "join(10000): " << d4.count() << endl;
}
ফলাফল (মিলিসেকেন্ড):
join(10) : 2
join(100) : 10
join(1000) : 91
join(10000): 898
char *
আপনি একে অপরের সাথে পয়েন্টার যুক্ত করার চেষ্টা করছেন বলে এটি নয় । এটিই ত্রুটিটি উত্পন্ন করে - কারণ পয়েন্টার সংমিশ্রণ করা অযৌক্তিক। নীচে উল্লিখিত হিসাবে, কমপক্ষে 1 ম অপারেন্ড একটি এ তৈরি করুনstd::string
এবং এতে কোনও ত্রুটি নেই।