// 答题框内的代码仅为待实现代码,执行或提交代码时,仅包含待实现部分,不要包含其它代码。
// CodeCheck/Cmetrics工具也仅扫描待实现部分。
// 若需要完整框架用于本地调试,请点击答题框上面的“下载完整框架代码”进行下载。
#include <string>
#include <vector>
#include <map>
using namespace std;
struct Compare {
bool operator()(const pair<int, vector<int>>& p1, const pair<int, vector<int>>& p2) const{
if ( p1.first != p2.first) {
return p1.first < p2.first;
} else {
for (int i = 0 ; i < p1.second.size(); ++i) {
if ((p1.second)[i] != (p2.second)[i]) return (p1.second)[i] < (p2.second)[i];
}
}
return false;
}
};
class MiniDb {
private:
map<int, pair<int, string>> keyMap;
map<pair<int, vector<int>>, vector<int>, Compare> dataMap;
public:
MiniDb()
{
}
void Create(int tableId, int colNum, const string& keys)
{
//pair<int, string> p = {colNum, keys};
//keyMap.insert(tableId, p);
}
void Insert(int tableId, const vector<int>& values)
{
auto it = keyMap.find(tableId);
if (it != keyMap.end()) {
vector<int> mark;
for (int i = 0; i < ((it->second).second).size(); ++i) {
mark.emplace_back(values[((it->second).second)[i] - 'a']);
}
pair<int, vector<int>> p = {tableId, mark};
dataMap[p] = values;
}
}
vector<vector<int>> Select(int tableId, const vector<string>& conditions)
{
vector<vector<int>> result;
for (auto it = dataMap.begin(); it != dataMap.end(); ++it) {
if (it->first.first == tableId) {
result.emplace_back(it->second);
}
}
int num = result.size();
for (int i = 0; i < conditions.size(); ++i) {
int key = conditions[i] - 'a';
int value = std::stoi(conditions[i].substr(2, conditions[i].size() - 2));
int mark = 0;
for (int i = 0; i < num; ++i) {
if (result[i][key] == value) {
result[mark] == result[i];
mark++;
}
}
num = mark;
}
vector<vector<int>> resultLast;
for (int i = 0; i < num; ++i) {
resultLast[i] = result[i];
}
return resultLast;
}
};
运行时报错main.cpp: In member function 'std::vector<std::vector<int> > MiniDb::Select(int, const std::vector<std::__cxx11::basic_string<char> >&)':
main.cpp:75:37: error: no match for 'operator-' (operand types are 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} and 'char')
int key = conditions[i] - 'a';
In file included from /usr/include/c++/8/bits/stl_algobase.h:67,
from /usr/include/c++/8/bits/char_traits.h:39,
from /usr/include/c++/8/ios:40,
from main.cpp:6:
/usr/include/c++/8/bits/stl_iterator.h:392:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr decltype ((__y.base() - __x.base())) std::operator-(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&)'
operator-(const reverse_iterator<_IteratorL>& __x,
^~~~~~~~
/usr/include/c++/8/bits/stl_iterator.h:392:5: note: template argument deduction/substitution failed:
main.cpp:75:39: note: 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} is not derived from 'const std::reverse_iterator<_Iterator>'
int key = conditions[i] - 'a';
^~~
In file included from /usr/include/c++/8/bits/stl_algobase.h:67,
from /usr/include/c++/8/bits/char_traits.h:39,
from /usr/include/c++/8/ios:40,
from main.cpp:6:
/usr/include/c++/8/bits/stl_iterator.h:1188:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr decltype ((__x.base() - __y.base())) std::operator-(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorR>&)'
operator-(const move_iterator<_IteratorL>& __x,
^~~~~~~~
/usr/include/c++/8/bits/stl_iterator.h:1188:5: note: template argument deduction/substitution failed:
main.cpp:75:39: note: 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} is not derived from 'const std::move_iterator<_IteratorL>'
int key = conditions[i] - 'a';
^~~
In file included from /usr/include/c++/8/vector:65,
from main.cpp:19:
/usr/include/c++/8/bits/stl_bvector.h:210:3: note: candidate: 'std::ptrdiff_t std::operator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)'
operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
^~~~~~~~
/usr/include/c++/8/bits/stl_bvector.h:210:3: note: no known conversion for argument 1 from 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} to 'const std::_Bit_iterator_base&'
In file included from /usr/include/c++/8/bits/stl_algobase.h:67,
from /usr/include/c++/8/bits/char_traits.h:39,
from /usr/include/c++/8/ios:40,
from main.cpp:6:
/usr/include/c++/8/bits/stl_iterator.h:954:5: note: candidate: 'template<class _IteratorL, class _IteratorR, class _Container> decltype ((__lhs.base() - __rhs.base())) __gnu_cxx::operator-(const __gnu_cxx::__normal_iterator<_IteratorL, _Container>&, const __gnu_cxx::__normal_iterator<_IteratorR, _Container>&)'
operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
^~~~~~~~
/usr/include/c++/8/bits/stl_iterator.h:954:5: note: template argument deduction/substitution failed:
main.cpp:75:39: note: 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} is not derived from 'const __gnu_cxx::__normal_iterator<_IteratorL, _Container>'
int key = conditions[i] - 'a';
^~~
In file included from /usr/include/c++/8/bits/stl_algobase.h:67,
from /usr/include/c++/8/bits/char_traits.h:39,
from /usr/include/c++/8/ios:40,
from main.cpp:6:
/usr/include/c++/8/bits/stl_iterator.h:966:5: note: candidate: 'template<class _Iterator, class _Container> typename __gnu_cxx::__normal_iterator<_Iterator, _Container>::difference_type __gnu_cxx::operator-(const __gnu_cxx::__normal_iterator<_Iterator, _Container>&, const __gnu_cxx::__normal_iterator<_Iterator, _Container>&)'
operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
^~~~~~~~
/usr/include/c++/8/bits/stl_iterator.h:966:5: note: template argument deduction/substitution failed:
main.cpp:75:39: note: 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} is not derived from 'const __gnu_cxx::__normal_iterator<_Iterator, _Container>'
int key = conditions[i] - 'a';
^~~