我试图使用STL函数for_each将字符串转换为小写,我不知道我做错了什么.这是有问题的for_each行:
clean = for_each(temp.begin(), temp.end(), low);
其中temp是一个包含字符串的字符串.这是我写的低功能:
void low(char& x)
{
x = tolower(x);
}
Run Code Online (Sandbox Code Playgroud)
我一直得到的编译器错误是这样的:
error: invalid conversion from void (*)(char&) to char [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
编辑:这是我写的整个功能:
void clean_entry (const string& orig, string& clean)
{
string temp;
int beginit, endit;
beginit = find_if(orig.begin(), orig.end(), alnum) - orig.begin();
endit = find_if(orig.begin()+beginit, orig.end(), notalnum) - orig.begin();
temp = orig.substr(beginit, endit - beginit);
clean = for_each(temp.begin(), temp.end(), low);
}
Run Code Online (Sandbox Code Playgroud) 平台:MinGW64(rubenvb 4.7.2),Windows 7(64),Qt 4.8.2
给定代码段如下:
/* type definition */
typedef long T_PSIZE;
struct A { T_PSIZE myArray[10]; };
struct B { T_PSIZE myArray[10]; };
/* declare variable */
A a;
B b;
std::copy(a.myArray[0], a.myArray[10], &b.myArray);
Run Code Online (Sandbox Code Playgroud)
我不知道为什么编译器抛出以下错误消息(当从'typedef long T_PSIZE''更改为'typedef int T_PSIZE'时,也会显示类似的消息):
> c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:
> In instantiation of '_OI std::__copy_move_a(_II, _II, _OI) [with bool
> _IsMove = false; _II = long int; _OI = long int (*)[9]]': c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:422:39:
> required from '_OI std::__copy_move_a2(_II, _II, _OI) [with bool
> _IsMove = false; _II …Run Code Online (Sandbox Code Playgroud) 那么std::find对象中的自定义类重载是否可能/"好" ?然后不重载相等运算符.说一个容器存储(智能)指向它的实际数据,我真的对数据布局或存储模式不感兴趣,我只是想找到一个特定的数据成员....
这是合法的,"道德的"吗?如果说我有std::vector<std::shared_ptr<myClass> >- 或"甚至"用户定义的容器?或者我应该总是依赖std::find_if这些案件?
尝试反转向量的一部分:
vector<int> nums{1,2,3};
std::reverse(nums.begin(), nums.end()); //LINE1
std::reverse(nums.begin(), (nums.begin() + 1)); //LINE2
std::reverse((nums.begin() + 2), nums.end()); //LINE3
Run Code Online (Sandbox Code Playgroud)
LINE1之后的数字为{3,2,1}
在LINE2和LINE3之后,没有变化。
预期:nums {2,3,1}
我想以类似std :: transform的方式将值插入到std :: vector中。std :: transform需要预先设置大小的第三个参数,但是在我的情况下,大小取决于transformers(),并且不可预测。
...
// std::vector<int> new_args(); <-- not working
std::vector<int> new_args(args.size());
std::transform(args.begin(),args.end(),new_args.begin(),transformers());
Run Code Online (Sandbox Code Playgroud)
是否有一种std:transform-ish方式将值插入到std :: vector中?
如何将模板化函数与STL提供的算法一起使用<algorithm>?例如,此代码无法编译,因为编译器无法推导出该predicate函数的模板参数:
#include <iostream>
#include <algorithm>
template< typename CharType >
bool predicate( const CharType& c )
{
return c == '0';
}
std::string
process_string( const std::string& str )
{
std::string result;
std::copy_if( str.begin( ),
str.end( ),
std::back_inserter( result ),
predicate );
return result;
}
int main()
{
std::cout << process_string("AK0NNDK0ASDAS0") << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) #include<utility>
#include<alogrithm>
#include<iostream>
using namespace std;
int main(void)
{
int n=5;
int s[]={3,5,1,5,5};
auto r=minmax_element(s,s+n);
cout<<r.second-s<<endl;
cout<<*r.second;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是使用索引打印数组中最大元素的代码.我想要索引最小的最大元素(如果是平局,则为第一个最大值)
我有一个由三个连续的子阵列A,B和C组成的数组[A,B,C].我想将较大的数组反转为[C,B,A].我目前的尝试涉及你的呼叫std::rotate,如下所示.我想知道是否有更简单/有效的方法来实现这一点,最好使用std算法.
Step 1: "swap" sub-array B,C
[A,B,C] -> [A|B,C] -> [A,C,B]
Step 2: "swap" sub-array A,C
[A,C,B] -> [A,C|B] -> [C,A,B]
Step 3: "swap" sub-array A,B
[C,A,B] -> [C|A,B] -> [C,B,A]
Run Code Online (Sandbox Code Playgroud)
编辑
例如,给定数组[1,2,3|4,5,6|7,8,9]我想"反转"它[7,8,9|4,5,6|1,2,3]
示例实施.请注意,"范围"的大小仅仅是说明性的.
我正在尝试创建一个插入一串字符的程序,验证它,然后对其进行排序并将其打印出来.
我确定这里有一个明显的逻辑错误,有人可以帮忙指出来吗?我花了好几个小时盯着我的屏幕.在我对C++的有限知识中,我尝试了所有我知道的东西,但是我仍然无法使用它.
你能提供的任何东西都会以某种方式帮助我,即使它是居高临下的.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void mySort(string &s);
int main()
{
string str;
char c;
bool invalid = true;
cout<<"Please enter some alphabetical characters:"<<endl;
cout<<"(* to end input): ";
do
{
getline(cin, str, '*');
for(int i = 0; i < str.length(); i++)
{
c = str.at(i);
}
if(! ( ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) ) )
{
cout<<"Error!"<<endl;
} …Run Code Online (Sandbox Code Playgroud)