C++、std::vector、libc++ における std::println(std::vector) のコンパイルエラーについて
エラーメッセージ
コンパイルエラーメッセージは、使用しているコンパイラによって異なりますが、以下のようなメッセージが表示されます。
error: no matching function for call to 'std::println(std::vector<int>)'
解決方法
このエラーを解決するには、以下の方法があります。
std::copy() を使用して要素を個別にコピーする
std::copy()
を使用して、std::vector
の要素を個別に std::ostream
にコピーしてから、std::println()
で出力することができます。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
std::for_each() を使用して要素を個別に処理する
std::for_each()
を使用して、std::vector
の要素を個別に処理し、std::cout
に出力することができます。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::for_each(vec.begin(), vec.end(), [](int n) { std::cout << n << " "; });
std::cout << std::endl;
return 0;
}
std::ranges::for_each() を使用して要素を個別に処理する (C++20 以降)
#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::ranges::for_each(vec, [](int n) { std::cout << n << " "; });
std::cout << std::endl;
return 0;
}
libc++ の std::vector::print() を使用する (libc++ のみ)
libc++
では、std::vector
に print()
メンバー関数が提供されています。この関数は、std::ostream
に std::vector
の内容を出力します。
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.print(std::cout);
std::cout << std::endl;
return 0;
}
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
出力:
1 2 3 4 5
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::for_each(vec.begin(), vec.end(), [](int n) { std::cout << n << " "; });
std::cout << std::endl;
return 0;
}
1 2 3 4 5
#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::ranges::for_each(vec, [](int n) { std::cout << n << " "; });
std::cout << std::endl;
return 0;
}
1 2 3 4 5
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.print(std::cout);
std::cout << std::endl;
return 0;
}
[1, 2, 3, 4, 5]
- ご自身の環境に合わせて、コードを修正する必要があります。
範囲ベースの for ループを使用する (C++11 以降)
C++11 以降では、範囲ベースの for
ループを使用して、std::vector
の要素を個別に処理することができます。
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
1 2 3 4 5
std::stringstream を使用する
#include <iostream>
#include <sstream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::stringstream ss;
for (int n : vec) {
ss << n << " ";
}
std::cout << ss.str() << std::endl;
return 0;
}
1 2 3 4 5
自作の関数を使用する
上記のいずれの方法にも満足できない場合は、自作の関数を使用して、std::vector
を出力することができます。
#include <iostream>
#include <vector>
void print_vector(const std::vector<int>& vec) {
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
print_vector(vec);
return 0;
}
1 2 3 4 5
c++ stdvector libc++