30 std::vector<T>
operator+(
const std::vector<T> &vec1,
const std::vector<T> &vec2);
41 std::vector<T>
operator*(
const std::vector<T> &vec1,
const std::vector<T> &vec2);
52 std::vector<T>
operator-(
const std::vector<T> &vec1,
const std::vector<T> &vec2);
63 int main(
int argc,
char const *argv[])
71 const std::string full_path_exec{argv[0]};
72 std::string::size_type found = full_path_exec.find_last_of(
"/\\", std::string::npos);
73 const std::string exec_path = full_path_exec.substr(0, found);
74 const std::string exec_filename = full_path_exec.substr(found + 1, std::string::npos);
75 const std::string data_file_name(
"\\ch8_3.result");
78 std::string data_file_full_path{exec_path + data_file_name};
79 std::ofstream fout(data_file_full_path.c_str(), std::ios_base::app);
82 std::cerr <<
"无写权限,测试数据文件生成失败!\n";
89 timeinfo = localtime(&rawtime);
91 std::cout <<
"\nCurrent local time and date: " << asctime(timeinfo) <<
'\n';
92 fout <<
"\nCurrent local time and date: " << asctime(timeinfo) <<
'\n';
97 std::vector<size_t> vec1, vec2, vec_union, vec_intersect, vec_diff;
103 size_t low{10}, high{25}, num_of_points{16};
105 for (
size_t i = 0; i < num_of_points; ++i)
107 iSecret = low + (high - low + 1) * rand() / (RAND_MAX + 1);
108 vec1.push_back(iSecret);
109 iSecret = low + (high - low + 1) * rand() / (RAND_MAX + 1);
110 vec2.push_back(iSecret);
114 std::vector<size_t>::iterator it;
116 std::sort(vec1.begin(), vec1.end());
117 it = std::unique(vec1.begin(), vec1.end());
118 vec1.resize(std::distance(vec1.begin(), it));
120 std::sort(vec2.begin(), vec2.end());
121 it = std::unique(vec2.begin(), vec2.end());
122 vec2.resize(std::distance(vec2.begin(), it));
125 std::cout <<
"set1 has " << (vec1.size()) <<
" elements:\n";
126 fout <<
"set1 has " << (vec1.size()) <<
" elements:\n";
127 for (
auto it = vec1.begin(); it != vec1.end(); ++it)
129 std::cout << *it <<
", ";
135 std::cout <<
"set2 has " << (vec2.size()) <<
" elements:\n";
136 fout <<
"set2 has " << (vec2.size()) <<
" elements:\n";
137 for (
auto it = vec2.begin(); it != vec2.end(); ++it)
139 std::cout << *it <<
", ";
146 vec_union = vec1 + vec2;
147 std::cout <<
"The union has " << (vec_union.size()) <<
" elements:\n";
148 fout <<
"The union has " << (vec_union.size()) <<
" elements:\n";
149 for (
auto it = vec_union.begin(); it != vec_union.end(); ++it)
151 std::cout << *it <<
", ";
157 vec_intersect = vec1 * vec2;
158 std::cout <<
"The intersection has " << (vec_intersect.size()) <<
" elements:\n";
159 fout <<
"The intersection has " << (vec_intersect.size()) <<
" elements:\n";
160 for (
auto it = vec_intersect.begin(); it != vec_intersect.end(); ++it)
162 std::cout << *it <<
", ";
168 vec_diff = vec1 - vec2;
169 std::cout <<
"The difference has " << (vec_diff.size()) <<
" elements:\n";
170 fout <<
"The difference has " << (vec_diff.size()) <<
" elements:\n";
171 for (
auto it = vec_diff.begin(); it != vec_diff.end(); ++it)
173 std::cout << *it <<
", ";
179 catch (
const std::string &e)
181 std::cerr << e <<
'\n';
184 catch (
const std::exception &e)
186 std::cerr << e.what() <<
'\n';
187 fout << e.what() <<
'\n';
193 std::cout <<
"\nIt took me " << t <<
" clicks (" << ((float)t) / CLOCKS_PER_SEC <<
" seconds).\n";
194 fout <<
"\nIt took me " << t <<
" clicks (" << ((float)t) / CLOCKS_PER_SEC <<
" seconds).\n";
203 std::vector<T>
operator+(
const std::vector<T> &vec1,
const std::vector<T> &vec2)
205 std::vector<T> vec_union(vec1.size() + vec2.size());
212 auto first1{vec1.begin()}, last1{vec1.end()};
219 auto first2{vec2.begin()}, last2{vec2.end()};
226 auto result{vec_union.begin()};
232 result = std::copy(first2, last2, result);
237 result = std::copy(first1, last1, result);
241 if (*first1 < *first2)
246 else if (*first2 < *first1)
259 vec_union.resize(result - vec_union.begin());
264 std::vector<T>
operator*(
const std::vector<T> &vec1,
const std::vector<T> &vec2)
266 std::vector<T> vec_intersect(vec1.size());
273 auto first1{vec1.begin()}, last1{vec1.end()};
280 auto first2{vec2.begin()}, last2{vec2.end()};
287 auto result{vec_intersect.begin()};
289 while (first1 != last1 && first2 != last2)
291 if (*first1 < *first2)
293 else if (*first2 < *first1)
303 vec_intersect.resize(result - vec_intersect.begin());
304 return vec_intersect;
308 std::vector<T>
operator-(
const std::vector<T> &vec1,
const std::vector<T> &vec2)
310 std::vector<T> vec_diff(vec1.size());
317 auto first1{vec1.begin()}, last1{vec1.end()};
324 auto first2{vec2.begin()}, last2{vec2.end()};
331 auto result{vec_diff.begin()};
333 while (first1 != last1 && first2 != last2)
335 if (*first1 < *first2)
341 else if (*first2 < *first1)
349 result = std::copy(first1, last1, result);
350 vec_diff.resize(result - vec_diff.begin());