cuốn sách gpt4 ai đã làm

c++ - Thêm hai bản đồ

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 01:04:53 30 4
mua khóa gpt4 Nike

Tôi muốn thêm hai bản đồ với hành vi sau.

Nếu khóa tồn tại -> thêm hai giá trị khóa.

Nếu khóa không tồn tại -> chèn ánh xạ cặp.

Tôi đã xem xét một số thuật toán thư viện tiêu chuẩn. tức là chuyển đổi, nhưng dường như không làm được điều tôi muốn.

Lấy từ cái nàyLINK

mẫu < lớp inputIterator, lớp OutputIterator, lớp UnaryOperator >
Biến đổi OutputIterator (InputIterator first1, inputIterator cuối1,
Kết quả OutputIterator, UnaryOperator op )
{
trong khi (đầu tiên1 != cuối1)
*result++ = op(*first1++); // hoặc: *result++=binary_op(*first1++,*first2++);
return result;
}

Ý tưởng của tôi là khi sử dụng các functor thích hợp, tôi chỉ có một trình vòng lặp trong bản đồ thứ hai của mình

 *kết quả++=binary_op(*first1++,*first2++);

Vì vậy, tôi sẽ không thể lặp lại bản đồ thứ hai của mình để tìm chìa khóa.

Một ý tưởng là thực hiện một thay đổi nhỏ đối với thuật toán của riêng tôi.

mẫu < lớp inputIterator, lớp ContainerType, lớp BinaryOperator >
void myTransform (InputIterator đầu tiên1, Đầu vàoIterator cuối1,
Loại vùng chứa tiếp2,
Toán tử nhị phân nhị phân_op)
{
trong khi (đầu tiên1 != cuối1)
nhị phân_op(first1++, cont2); //cont2 được truyền theo tham chiếu
}

Sau đó tôi có thể sử dụng:

cont2.find() Tìm kiếm toàn bộ bản đồ trong functor của tôi.

Đây sẽ là một ví dụ đầy đủ hơn về những gì tôi đang nghĩ, nhưng dường như tôi đang gặp phải một lỗi biên dịch mà tôi không thể giải quyết được (tôi đoán là loại BinaryOperator... xem bên dưới)?

#include 
#include
#include

mẫu < lớp inputIterator, lớp ContainerType, lớp BinaryOperator >
void myTransform (InputIterator đầu tiên1, Đầu vàoIterator cuối1,
Loại vùng chứa &cont2,
Toán tử nhị phân nhị phân_op)
{
trong khi (đầu tiên1 != cuối1)
nhị phân_op(first1++, cont2); //cont2 được truyền theo tham chiếu
}

mẫu
cấu trúc AddMapValues:
std::binary_function
{
void toán tử()(IteratorType itr, ContainerType& cont)
{
if( cont.find(itr->first) != cont.end() ) cont[itr->first] = cont.find(itr->first).second + itr->second;
khác cont.insert( (*itr) );
}
};


int main()
{
typedef std::map stringDoubleMap;
typedef std::map::iterator stringDoubleMapItr;
typedef void (*ptrfnt)(stringDoubleMapItr, stringDoubleMap& );

stringDoubleMap map1;
stringDoubleMap map2;

map1.insert( stringDoubleMap::value_type("Test1",1.0) );
map1.insert( stringDoubleMap::value_type("Test2",2.0) );
map1.insert( stringDoubleMap::value_type("Test3",3.0) );

map2.insert( stringDoubleMap::value_type("Test1",1.0) );
map2.insert( stringDoubleMap::value_type("Test2",2.0) );
map2.insert( stringDoubleMap::value_type("Test3",3.0) );

myTransform(map1.begin(), map1.end(),
bản đồ2,
AddMapValues< stringDoubleMapItr, stringDoubleMap >() );

return 0;

}

Đây là lỗi trình biên dịch của tôi:

testingMapTransforms.cxx: Trong hàm 'int main()':

testMapTransforms.cxx:52:85: lỗi: không có chức năng khớp để gọi tới 'myTransform(std::map<>, double>::iterator, std::map<> , double>::iterator, stringDoubleMap&, std::map<>, double>::iterator, AddMapValues<><>, double> >, std::map<>, double> >)'

testingMapTransforms.cxx:52:85: lưu ý: ứng viên là:

testingMapTransforms.cxx:12:20: lưu ý: template OutputIterator myTransform(InputIterator, inputIterator, ContainerType, OutputIterator, BinaryOperator)

Dường như có một trình vòng lặp khác đến từ đâu đó và loại vùng chứa không được đọc chính xác?

Có ý tưởng gì không?

tôi đang sử dụng

gcc - Trình biên dịch GNU Project C và C++

Ubuntu/Linaro 4.6.3-1ubuntu5

Cảm ơn

Để ý:

Tôi đã cập nhật câu trả lời của mình bằng phiên bản mã đang hoạt động ở trên. Nếu bạn nghĩ tôi chỉ nên thay đổi mã vấn đề thì hãy cho tôi biết. Không chắc chắn về cách thực hành tốt nhất

câu trả lời hay nhất

Tôi muốn thêm hai bản đồ cùng với hành vi sau:
Nếu khóa tồn tại, hãy thêm hai giá trị khóa lại với nhau.
Nếu khóa không tồn tại. Chèn cặp vào bản đồ.

Tôi nghĩ một vòng lặp for đơn giản sẽ làm được những gì bạn cần:

for(auto it = map2.begin(); it != map2.end(); ++it) map1[it->first] += it->second;

Nếu khóa tồn tại, giá trị sẽ được thêm vào khóa hiện có. Nếu khóa không tồn tại,toán tử [] Nó sẽ được chèn vào và giá trị của nó sẽ được khởi tạo mặc định (0,0 cho gấp đôi).

Tôi không nghĩ sẽ khôn ngoan khi sử dụng một hàm chung phù hợp với bất kỳ vùng chứa nào ở đây. Ngữ nghĩa của hàm chèn() và toán tử [] của vectơ và bản đồ rất khác nhau.

Về C++ - thêm hai bản đồ, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/11013591/

30 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress